Câu trả lời:
Bạn nên sử dụng pip
's list
lệnh với grep, mà chỉ liệt kê các cài đặt gói (không phải tất cả các module và các nước láng giềng của họ cũng):
pip list | grep -F package_name
Nếu pack_name khớp với nhiều gói đã cài đặt, ví dụ như tìm kiếm boto
khi nào botocore
cũng được cài đặt, thì việc sử dụng -w
thay vì -F
có thể giúp ích, như @TaraPrasadGurung gợi ý. Điều này không liệt kê gói chính xác, vì -w
thấy các ký tự phổ biến trong tên gói là ranh giới từ. Vì vậy, nếu bạn có requests
và đã requests-cache
cài đặt hoặc ruamel.yaml
và ruamel.yaml.cmd` và cần chính xác một dòng đầu ra, bạn cần phải làm một cái gì đó như:
pip list --disable-pip-version-check | grep -E "^ruamel\.yaml "
Xin lưu ý rằng vì .
phù hợp với bất kỳ nhân vật nào khi sử dụng -E
, bạn cần phải thoát nó.
¹ Và có những gì cần thiết là có một gói ruamel_yaml
. Không phải mọi trình quản lý gói đều pip
tương thích khi xử lý các gói không gian tên.
-w
ranh giới từ và phổ biến trong tên gói. Tôi nhận được nhiều trận đấu khi tôi sử dụng đề xuất của bạn bằng cách sử dụng grep -w ruamel.yaml
hoặcgrep -w request
pip list | grep -F mxnet-cu101
in mxnet-cu101 1.5.0
, nhưng không chính xác nơi nó được cài đặt. Bất kỳ ý tưởng làm thế nào để có được đường dẫn cài đặt? `
Tôi đã tìm thấy câu trả lời hiện tại không đầy đủ và thiếu các ví dụ đủ tốt. Đây là giải pháp tôi đã giải quyết:
# 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
Một ý chính Github của ví dụ này có thể được tìm thấy ở đây: https://gist.github.com/shaypal5/d505af9953cd86f59c750fa600ee4ba6
Bạn cũng có thể sử dụng một cái gì đó như thế này trong kịch bản của bạn.
python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
Những gì bạn nhận được khi một gói không được cài đặt.
Package=psutil
python3 -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
echo $?
1
Những gì bạn nhận được khi một gói được cài đặt.
Package=requests
python3 -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
echo $?
0
Hoạt động trong python2 và python3, sau đó bạn cài đặt dựa trên mã thoát.
Tôi đã sử dụng một phiên bản nghiêm ngặt hơn một chút của câu trả lời của Anthon, để sử dụng trong một kịch bản:
pip3 list |
grep -v "^Package *Version$" | grep -v "^-*$" |
cut -d ' ' -f 1 |
grep -xF "$package_name"
Hai greps đầu tiên được dự định để loại bỏ các dòng tiêu đề từ đầu ra của pip3.
Việc cắt sau đó chỉ chọn tên gói (loại bỏ số phiên bản).
Sau đó, grep cuối cùng có thể thực hiện tìm kiếm chính xác cho liên quan $package_name
Nếu gói được tìm thấy, nó sẽ hiển thị tên gói và trả về với mã thoát 0. Nếu bạn không muốn thấy tên gói, hãy kết thúc lệnh bằng >/dev/null
trong trình bao / nhắc Python. :
>>> help('modules')
pip install
. Nếu nó đã được cài đặt, nó sẽ không cài đặt lại.