Apa cara yang baik untuk memeriksa apakah sebuah paket diinstal saat berada dalam skrip Python? Saya tahu itu mudah dari penerjemah, tetapi saya perlu melakukannya dalam skrip.
Saya kira saya dapat memeriksa apakah ada direktori di sistem yang dibuat selama instalasi, tetapi saya merasa ada cara yang lebih baik. Saya mencoba memastikan paket Skype4Py telah diinstal, dan jika tidak, saya akan menginstalnya.
Ide saya untuk menyelesaikan pemeriksaan
- periksa direktori di jalur pemasangan biasa
- coba impor paket dan jika pengecualian dibuang, maka instal paket
python
package
skype
python-import
Kevin
sumber
sumber
Jawaban:
Jika yang Anda maksud adalah skrip python, lakukan saja seperti ini:
Python 3.3+ menggunakan sys.modules dan find_spec :
Python 3:
Python 2:
sumber
Jawaban yang diperbarui
Cara yang lebih baik untuk melakukannya adalah:
Hasil:
Periksa apakah
requests
sudah terpasang:Kenapa begini? Terkadang Anda mengalami benturan nama aplikasi. Mengimpor dari namespace aplikasi tidak memberi Anda gambaran lengkap tentang apa yang diinstal di sistem.
Perhatikan, solusi yang diusulkan berhasil:
pip install http://some.site/package-name.zip
atau jenis arsip lainnya).python setup.py install
.sudo apt install python-requests
.Kasus ketika itu mungkin tidak berhasil:
python setup.py develop
.pip install -e /path/to/package/source/
.Jawaban lama
Cara yang lebih baik untuk melakukannya adalah:
Untuk pip> = 10.x gunakan:
Kenapa begini? Terkadang Anda mengalami benturan nama aplikasi. Mengimpor dari namespace aplikasi tidak memberi Anda gambaran lengkap tentang apa yang diinstal di sistem.
Hasilnya, Anda mendapatkan daftar
pkg_resources.Distribution
objek. Lihat yang berikut ini sebagai contoh:Buat daftarnya:
Periksa apakah
requests
sudah terpasang:sumber
import json
benar-benar berfungsi). Metode ice.nicer bekerja dalam kasus ini.if "u'requests'" in installed_packages:
dari Jawaban yang Diperbarui untuk bekerja untuk saya. Output dariprint()
menghasilkan ini pada macOS python saya:[..., u'pytz', u'requests', ...]
if "requests'"
(perhatikan kutipan tunggal di bagian akhir). tidak masuk akal sama sekali.pip
. Misalnya, Anda dapat membuat dan menginstal paket dari sumber. Jawaban ini tidak akan menemukannya. Jawaban dari @ ice.nicer tentangfind_spec()
benar.Pada Python 3.3, Anda dapat menggunakan find_spec () metode
sumber
importlib.util.find_spec('google-cloud-logging')
tidak menemukan apa pun saatimportlib.util.find_spec('google.cloud.logging')
ditemukan. Nama dan nama resmi yang ditampilkan pip adalah dengan tanda hubung, bukan titik. Mungkin membingungkan karena itu gunakan dengan hati-hati.Jika Anda ingin mendapatkan cek dari terminal, Anda dapat menjalankannya
dan jika tidak ada yang dikembalikan, paket tersebut tidak diinstal.
Jika mungkin Anda ingin mengotomatiskan pemeriksaan ini, sehingga misalnya Anda dapat menginstalnya jika hilang, Anda dapat memiliki yang berikut ini di skrip bash Anda:
sumber
if
untuk langsung menguji perintah yang berhasil:if pip3 show package_name 1>/dev/null; then ...
Sebagai perpanjangan dari jawaban ini :
Untuk Python 2. *,
pip show <package_name>
akan melakukan tugas yang sama.Misalnya
pip show numpy
akan mengembalikan yang berikut atau serupa:sumber
Anda dapat menggunakan modul pkg_resources dari setuptools. Sebagai contoh:
Perhatikan bahwa ada perbedaan antara modul python dan paket python. Sebuah paket dapat berisi beberapa modul dan nama modul mungkin tidak cocok dengan nama paket.
sumber
Buka jenis prompt perintah Anda
sumber
Saya ingin menambahkan beberapa pemikiran / temuan saya ke topik ini. Saya sedang menulis skrip yang memeriksa semua persyaratan untuk program yang dibuat khusus. Ada banyak pemeriksaan dengan modul python juga.
Ada sedikit masalah dengan
larutan. Dalam kasus saya, salah satu modul python dipanggil
python-nmap
, tetapi Anda mengimpornya denganimport nmap
dan seperti yang Anda lihat nama tidak cocok. Oleh karena itu pengujian dengan solusi di atas mengembalikan hasil False, dan juga mengimpor modul saat dipukul, tetapi mungkin tidak perlu menggunakan banyak memori untuk pengujian / pemeriksaan sederhana.Saya juga menemukan itu
installed_packages
akan memiliki hanya paket telah diinstal dengan pip . Pada sistem sayapip freeze
mengembalikan40
modul python, sementarainstalled_packages
hanya memiliki1
, yang saya instal secara manual (python-nmap).Solusi lain di bawah ini yang saya tahu mungkin tidak relevan dengan pertanyaan tersebut , tetapi menurut saya merupakan praktik yang baik untuk menjaga fungsi pengujian tetap terpisah dari yang melakukan penginstalan, mungkin berguna bagi sebagian orang.
Solusi yang berhasil untuk saya. Itu berdasarkan jawaban ini Bagaimana memeriksa apakah modul python ada tanpa mengimpornya
CATATAN: solusi ini tidak dapat menemukan modul dengan namanya
python-nmap
juga, saya harus menggunakannmap
sebagai gantinya (mudah digunakan ) tetapi dalam hal ini modul tidak akan dimuat ke memori sama sekali.sumber
Jika Anda ingin skrip Anda menginstal paket yang hilang dan melanjutkan, Anda dapat melakukan sesuatu seperti ini (pada contoh modul 'krbV' dalam paket 'python-krbV'):
sumber
Cara cepat adalah dengan menggunakan alat baris perintah python . Cukup ketik
import <your module name>
Anda melihat kesalahan jika modul hilang.sumber
Hmmm ... jawaban terdekat yang saya lihat adalah menggunakan baris perintah untuk mencoba mengimpor. Tapi saya lebih suka menghindari itu.
Bagaimana dengan 'pip freeze | grep pkgname '? Saya mencobanya dan berhasil dengan baik. Ini juga menunjukkan kepada Anda versi yang dimilikinya dan apakah itu diinstal di bawah kontrol versi (instal) atau diedit (kembangkan).
sumber
class myError (pengecualian): lulus #atau lakukan sesuatu coba: impor mymodule kecuali ImportError sebagai e: menaikkan myError ("terjadi kesalahan")
sumber
Di tipe Terminal
Contoh
sumber
Saya ingin mengomentari balasan @ ice.nicer tetapi saya tidak bisa, jadi ... Pengamatan saya adalah bahwa paket dengan tanda hubung disimpan dengan garis bawah, tidak hanya dengan titik seperti yang ditunjukkan oleh komentar @dwich
Misalnya, Anda melakukannya
pip3 install sphinx-rtd-theme
, tetapi:importlib.util.find_spec(sphinx_rtd_theme)
mengembalikan sebuah Objekimportlib.util.find_spec(sphinx-rtd-theme)
mengembalikan Tidak adaimportlib.util.find_spec(sphinx.rtd.theme)
memunculkan ModuleNotFoundErrorApalagi beberapa nama berubah total. Misalnya, Anda melakukannya
pip3 install pyyaml
tetapi disimpan sebagai fileyaml
Saya menggunakan python3.8
sumber
sumber
Pergi opsi # 2. Jika
ImportError
dilempar, maka paket tersebut tidak diinstal (atau tidak disys.path
).sumber