Bagaimana saya memeriksa apakah suatu modul dipasang dengan Python, dan menginstalnya jika perlu?

89

Di terminal, setelah saya memulai Python, bagaimana saya tahu modul apa saja yang ada di python? Misalkan saya perlu mempelajari modul NumPy dan SciPy.

  • Bagaimana saya menginstalnya jika tidak diinstal?
  • Bagaimana saya tahu jika sudah diinstal?
TechJhola
sumber

Jawaban:

73

Cara mengetahui apakah modul python diinstal atau tidak dalam sistem: Anda dapat melakukan tes yang sangat mudah di terminal,

$ python -c "import math"
$ echo $?
0                                # math module exists in system

$ python -c "import numpy"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named numpy
$ echo $?
1                                # numpy module does not exist in system

Bagaimana saya menginstalnya jika tidak diinstal?

Anda dapat menginstal modul tertentu dengan mengunduh paket masing-masing dari repositori, misalnya Anda dapat menginstalscipy sebagai,

sudo apt-get install python-scipy ## for Python2
sudo apt-get install python3-scipy ## for Python3

Bergantian Anda juga dapat menginstal modul python menggunakan python-pipseperti yang disarankan oleh Zack Titan di komentar di bawah ini , Untuk menginstal numpyAnda dapat menggunakan

pip install numpy

Peringatan: Sangat disarankan untuk menginstal modul python hanya menggunakan repositori resmi Ubuntu dan tidak menggunakan pipmetode sebagai superuser (yaitu, sebagai rootatau menggunakan sudo). Dalam beberapa kasus, ini dapat membuat sistem Anda tidak dapat digunakan dengan memecah sistem python.

Cara menginstal paket menggunakan pipke lingkungan virtual lokal.

souravc
sumber
Seperti dalam modul matematika jawaban Anda ada dan untuk mati rasa traceback tidak muncul dan untuk $ echo? output 0, Apakah itu berarti numpy juga ada di sistem saya?
TechJhola
1
ya, itu ada di sistem Anda.
souravc
Jika Anda tidak memiliki modul numpy, bagaimana Anda akan mengimpornya? Ketika kita melakukan pengkodean kita memanggil pernyataan impor dengan dari numpy import *, apakah akan menginstal modul? Jika tidak, bagaimana kami memasang modul baru?
TechJhola
1
Ini akan menjadi pertanyaan septate bagaimana menginstal modul. Perlu paket berbeda untuk modul berbeda. Sebagai contoh untuk menginstal vpythonAnda harus menginstalnya sebagaisudo apt-get install python-visual libgtkglextmm-x11-1.2-dev
souravc
1
jangan gunakan sudo pip; itu dapat merusak sistem python. Gunakan apt-get untuk menginstal paket untuk sistem python. Anda bisa menggunakan pip --useropsi atau virtualenv untuk menginstal paket Python untuk Anda sendiri.
jfs
21

Jika kita tidak ingin mengimpor modul yang tidak diinginkan (yang akan terjadi dalam trypernyataan), kita dapat menggunakan sys.modulesuntuk menguji modul yang diinstal dan diimpor sebelumnya.

Dalam masalah shell python:

>>> import sys

Kemudian uji untuk modul yang diinstal:

>>> 'numpy' in sys.modules
True
>>> 'scipy' in sys.modules
False

Perhatikan bahwa hanya modul-modul yang diimpor sebelum memberikan Truepengujian ini, semua modul lain (bahkan jika diinstal) menghasilkanFalse.

Alternatif lain untuk trysebuah importpernyataan di konsol python memanggil inbuilt help()fungsi. Ini tidak akan memberikan dokumentasi untuk modul yang tidak diinstal, misalnya

>>> help('scipy')
no Python documentation found for 'scipy'

Output dokumen bantuan yang sangat panjang dari modul yang diinstal dapat terganggu Q.

Sekarang untuk menginstal modul yang hilang, disarankan untuk menggunakan manajemen paket Ubuntu (dan bukan cara pip Python) karena kita memerlukan akses root dan juga untuk mencegah mengacaukan sistem Python-dependend kita. Untuk modul yang dimaksud misalnya adalah:

sudo apt-get install python-scipy ## for Python2
sudo apt-get install python3-scipy ## for Python3

Setelah instalasi kita kemudian dapat menambahkannya ke sys.moduleskamus dengan mengimpornya sekali.

Takkat
sumber
1
Saya pikir ini adalah jawaban yang paling Pythonic ....
Grijesh Chauhan
3
Bagian pertama ini salah: sys.moduleshanya berisi modul yang sudah diimpor , jadi ini bukan cara yang dapat diandalkan untuk menguji apakah suatu modul telah diinstal. Tes yang paling dapat diandalkan adalah dengan menggunakan a try/exceptdan menjebaknya ImportError, seperti yang telah disarankan beberapa orang lainnya.
ekhumoro
@ekhumoro - terima kasih, saya akan mengedit jawaban saya untuk membuatnya lebih jelas.
Takkat
4
Tampaknya masih belum cukup jelas. Mengingat bahwa pertanyaannya adalah menanyakan bagaimana mencari tahu apakah modul dipasang (tidak diimpor ), sys.modulessama sekali tidak relevan dan saya pikir penyebutan itu menyesatkan. Tapi mungkin itu hanya aku.
David Z
1
sys.modulestidak ada bantuan di sini.
kucing
19

Cara lain adalah pkgutilmodul. Bekerja dengan Python 2 & 3:

python -c 'import pkgutil; print(1 if pkgutil.find_loader("module") else 0)'

Anda perlu mengganti moduledengan nama modul Anda, contoh:

$ python -c 'import pkgutil; print(1 if pkgutil.find_loader("math") else 0)'
1
cuonglm
sumber
2
Saya melihat Anda membuka kancing beberapa perubahan saya; print()juga akan berfungsi dengan baik di Python 2; Itu diperlakukan sebagai sintaks grup-dengan-parens, dan tidak memiliki efek samping. Hanya ketika Anda ingin menambahkan beberapa item (seperti di print('a', 'b')dalamnya akan diperlakukan sebagai tuple, di mana Anda memang membutuhkannya from __future__ import print_function, tetapi itu tidak berlaku dalam kasus ini, Anda hanya dapat menulis kode yang kompatibel dengan maju dengan menambahkan parens (saya menguji perubahan saya dalam Python 2 dan 3)
Martin Tournoij
@Carpetsmoker: Terima kasih telah menunjukkan. Saya kembalikan ke versi lama.
cuonglm
Ini jawaban yang bagus. Saya menambahkan jawaban turunan yang mengembalikan kode status / keluar (untuk kontrol aliran skrip shell) dan menggunakan nama modul sebagai argumen baris perintah. askubuntu.com/a/891384/146273
Bruno Bronosky
Itu berhasil! - Cukup ubah exitsehingga dapat digunakan dalam konteks shell:python -c 'import pkgutil; exit(0 if pkgutil.find_loader("math") else 2)'
AT
12

Saya tahu OP awalnya meminta solusi setelah memulai Python, tetapi di luar python saya gunakan pip. Di ubuntu:, sudo apt-get install python-pipjika belum diinstal.

Kemudian untuk melihat modul pihak ketiga apa yang tersedia, jalankan saja:

pip freeze

Atau bahkan

pip list

Dan keduanya akan menunjukkan kepada Anda semua modul yang terpasang dan versinya.

Jika modul yang Anda cari tidak diinstal, sebagian besar waktu Anda dapat dengan mudah menginstalnya dengan pip:

pip install <module-name>

Jika Anda tidak yakin apakah modul itu ada atau apa namanya PyPI, gunakan pip search:

pip search <keyword>
OozeMeister
sumber
1
Juga, pip show <module-name>akan menunjukkan apakah suatu paket diinstal, mis pip show numpy.
Insinyur Gratis Herpes
10

Anda bisa memasukkan kode ke dalam try, exceptblokir.

$ python3 -c "\
try:
    import cow  
    print('\nModule was installed')
except ImportError:
    print('\nThere was no such module installed')"

There was no such module installed

$ python3 -c "\
try:
    import regex
    print('\nModule was installed')
except ImportError:
    print('\nThere was no such module installed')"

Module was installed
Avinash Raj
sumber
6

Untuk memberikan jawaban lain, demi penyelesaian:

Anda dapat (ab) menggunakan -mopsi. Dari halaman Python:

   -m module-name
          Searches sys.path for the named module and runs the  correspond
          ing .py file as a script.

Yang akan memberi kita:

$ python2 -m numpy
/sbin/python2: No module named numpy.__main__; 'numpy' is a package and cannot be directly executed

$ python2 -m math
/sbin/python2: No code object available for math

Tetapi untuk modul yang tidak ada, itu akan memberi kita:

$ python2 -m doesnt_exist
/sbin/python2: No module named doesnt_exist

Kita bisa menggunakan grepuntuk mencocokkan ini:

$ python2 -m doesnt_exist |& grep -q 'No module named' && echo 'Nope' || echo 'Yup'
Nope

$ python2 -m math |& grep -q 'No module named' && echo 'Nope' || echo 'Yup'
Yup

Ini sedikit hack-ish, dan bukan untuk apa -m; tetapi ini adalah metode yang paling tidak membutuhkan pengetikan jika Anda ingin tes cepat :-)

Martin Tournoij
sumber
4
grep -qmembuat pengalihan ke nol tidak perlu.
muru
3
@muru Yikes! Saya telah mengetik banyak /dev/null
arahan
4

Saya menulis contoh dengan Python:

import pip
import sys
from bigml.api import BigML


if not 'bigml' in sys.modules.keys():
    pip.main(['install', 'bigml'])
Mona Jalal
sumber
3

Pemeriksaan oneliner Shell (berguna untuk penyediaan)

Saya menemukan bahwa untuk membuat penyediaan infrastruktur saya ** idempoten, saya harus dapat memeriksa paket dari shell di oneliner. Saya membangun jawaban @ cuonglm. Saya harus membalikkan 1dan 0karena saya menghasilkan status keluar daripada mencetak string.

python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader(sys.argv[1]) else 1)" pymongo

Anda dapat menggantinya sys.argv[1]dengan nama yang dikutip tunggal dari paket Anda, tetapi untuk skrip penyediaan saya, saya suka keterbacaan memilikinya pada akhirnya.

python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('pymongo') else 1)"

** Saya menyadari bahwa koki , boneka , dan yang mungkin semua memiliki plugin untuk mengelola paket python, tetapi Anda mungkin menemukan diri Anda dalam situasi seperti saya di mana Anda menggunakan versi yang sudah ketinggalan zaman dan tidak ingin menggunakan plugin yang sudah usang.

Bruno Bronosky
sumber
1

Satu juga dapat menggunakan pydoc modules, yang dapat disaring dengan grepuntuk menemukan modul tertentu. Outputnya ditampilkan dalam format kolom. Satu-satunya kelemahan dari pendekatan ini adalah bahwa ia juga akan memasukkan file python dalam direktori kerja saat ini. Meskipun demikian, saya sering menggunakannya sendiri dan ini adalah salah satu pendekatan yang sangat dikutip pada pertanyaan terkait ini: https://stackoverflow.com/q/739993/3701431

Sergiy Kolodyazhnyy
sumber
0

Dari Shell Ubuntu, secara default bash, sesederhana

pip list | grep <package-name-Case-Matters>

Contohnya

pip list | grep pywinrm

pip list | grep numpy

Dan, jika Anda memiliki keraguan tentang kasus ini (meskipun saya pikir semua nama paket selalu huruf kecil):

pip list | grep [Nn]um[Pp]y  # it works with numpy, Numpy, numPy, and NumPy
xCovelus
sumber