Làm thế nào để kiểm tra nếu một mô-đun hoặc một gói đã được cài đặt trong python3?


10

Cần xác minh xem nó đã được cài đặt hay chưa trước khi chương trình có thể chạy.


2
Chỉ cần chạy pip install. Nếu nó đã được cài đặt, nó sẽ không cài đặt lại.
jordanm

Thnk bạn jordanm, nhưng tôi cần kiểm tra và đưa áo / p sau đó thử nghiệm.
hubatrix

Câu trả lời:


3

Nhập vào vỏ : pydoc modules.
Điều này sẽ liệt kê các mô-đun và bạn có thể grep mô-đun mà bạn muốn.
Tìm thấy trên stackoverflow tại đây


11

Bạn nên sử dụng pip's listlệ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 botokhi nào botocorecũng được cài đặt, thì việc sử dụng -wthay vì -Fcó thể giúp ích, như @TaraPrasadGurung gợi ý. Điều này không liệt kê gói chính xác, vì -wthấ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ó requestsvà đã requests-cachecài đặt hoặc ruamel.yamlvà 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 piptương thích khi xử lý các gói không gian tên.


Vấn đề với điều này là nếu tên gói boto và botocore được cài đặt, nó sẽ liệt kê cả hai. Vì vậy, giải pháp tốt hơn sẽ là sử dụng cờ -w thay vì -F để liệt kê gói chính xác
Tara Prasad Gurung

@TaraPrasadGurung Mặc dù điều đó có thể giúp giảm sản lượng phần nào nhưng nó không giúp lấy được gói chính xác như bạn yêu cầu. Ví dụ: dấu chấm và dấu gạch ngang được lấy theo -wranh 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.yamlhoặcgrep -w request
Anthon

pip list | grep -F mxnet-cu101in 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? `
Anu

@any Có, tôi có một ý tưởng hay về cách lấy lại gói Python được cài đặt cho tôi biết tên của nó. Bạn nên đăng câu hỏi trên trang này và ping tôi ở đây để tôi chú ý khi bạn làm vậy, vì tôi không theo dõi những câu hỏi mới được đăng trên U & L.
Anthon

4

Nếu gói không làm điều gì đó điên rồ hoặc mất thời gian khi nhập, bạn có thể thử thực sự nhập nó:

if python -c "import package_name" &> /dev/null; then
    echo 'all good'
else
    echo 'uh oh'
fi

2

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


điều này trông thực sự giống với câu trả lời hiện có
Jeff Schaller

1
Mã bash tương tự nhau, mã Python khác nhau, điều này tạo ra sự khác biệt khá lớn. Tôi đã đọc tất cả các câu trả lời hiện có trước khi chọn thêm câu trả lời của riêng mình và câu trả lời cụ thể mà bạn liên kết đến không phù hợp với tôi. Vì vậy, tôi thấy nó có liên quan và có giá trị để thêm câu trả lời của tôi ở đây. :)
ShayPal5

1

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.


0

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


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.