Jawaban:
Anda harus menggunakan pip
's list
perintah dengan grep, bahwa hanya daftar diinstal paket (tidak semua modul dan tetangga mereka juga):
pip list | grep -F package_name
Jika package_name cocok dengan beberapa paket yang diinstal misalnya mencari boto
kapan botocore
juga diinstal, maka menggunakan -w
bukannya -F
dapat membantu, seperti yang disarankan @TaraPrasadGurung. Ini tidak mencantumkan paket yang tepat, karena -w
melihat karakter umum dalam nama paket sebagai batas kata. Jadi jika Anda memiliki requests
dan requests-cache
menginstal atau ruamel.yaml
dan ruamel.yaml.cmd` dan membutuhkan satu baris output, Anda perlu melakukan sesuatu seperti:
pip list --disable-pip-version-check | grep -E "^ruamel\.yaml "
Harap dicatat bahwa karena .
cocok dengan karakter apa pun saat menggunakan -E
, Anda harus menghindarinya.¹
¹ Dan ya itu perlu karena ada paket ruamel_yaml
. Tidak setiap manajer paket pip
kompatibel ketika berhadapan dengan paket namespace.
-w
sebagai batas kata dan umum dalam nama paket. Saya mendapatkan beberapa pertandingan ketika saya menggunakan saran Anda menggunakan grep -w ruamel.yaml
ataugrep -w request
pip list | grep -F mxnet-cu101
mencetak mxnet-cu101 1.5.0
, tetapi tidak persis di mana itu dipasang. tahu bagaimana cara mendapatkan jalur yang diinstal? `
Saya telah menemukan jawaban yang ada tidak lengkap dan kurang contoh yang cukup baik. Inilah solusi yang telah saya pilih:
# an example checking if the pandas package is installed
if python -c 'import pkgutil; exit(not pkgutil.find_loader("pandas"))'; then
echo 'pandas found'
else
echo 'pandas not found'
fi
Inti Github dari contoh ini dapat ditemukan di sini: https://gist.github.com/shaypal5/d505af9953cd86f59c750fa600ee4ba6
Anda juga dapat menggunakan sesuatu seperti ini di skrip Anda.
python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
Apa yang akan Anda dapatkan ketika paket tidak diinstal.
Package=psutil
python3 -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
echo $?
1
Apa yang akan Anda dapatkan ketika paket diinstal.
Package=requests
python3 -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
echo $?
0
Bekerja di python2 dan python3, dan kemudian Anda menginstal berdasarkan kode keluar.
Saya menggunakan versi jawaban Anthon yang sedikit lebih ketat, untuk digunakan dalam skrip:
pip3 list |
grep -v "^Package *Version$" | grep -v "^-*$" |
cut -d ' ' -f 1 |
grep -xF "$package_name"
Dua greps pertama dimaksudkan untuk menghilangkan garis header dari output pip3.
Pemotongan kemudian hanya memilih nama paket (membuang nomor versi).
Kemudian grep terakhir dapat melakukan pencarian tepat untuk yang relevan $package_name
Jika paket ditemukan, itu akan menampilkan nama paket, dan kembali dengan kode keluar 0. Jika Anda tidak ingin melihat nama paket, akhiri perintah dengan >/dev/null
dalam shell Python / prompt. :
>>> help('modules')
Diuji dengan pip3:
$> pip3 show MODULENAME
Kode keluar ($?) Akan menjadi "0" jika modul diinstal, atau "1".
Grepping memiliki masalah "false positive": Output dari a
pip list | grep NAME
akan cocok dengan modul apa pun yang namanya berisi "NAME", mis. juga cocok dengan "some_other_NAME".
Sementara
pip3 show MODULENAME
hanya kecocokan pada kecocokan lengkap.
pip install
. Jika sudah diinstal, itu tidak akan menginstalnya lagi.