Làm cách nào để kiểm tra xem một mô-đun có được cài đặt trong Python không và cài đặt nó nếu cần?


89

Trong terminal, sau khi tôi khởi động Python, làm sao tôi biết các mô-đun có trong python là gì? Giả sử tôi cần học các mô-đun NumPy và SciPy.

  • Làm thế nào tôi sẽ cài đặt nó nếu nó không được cài đặt?
  • Làm sao để biết nó đã được cài đặt chưa?

Câu trả lời:


73

Cách nhận biết mô-đun python có được cài đặt hay không trong hệ thống: Bạn có thể thực hiện một thử nghiệm rất dễ dàng trong thiết bị đầu cuối,

$ 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

Làm thế nào tôi sẽ cài đặt nó nếu nó không được cài đặt

Bạn có thể cài đặt mô-đun cụ thể bằng cách tải xuống các gói tương ứng từ kho lưu trữ, ví dụ bạn có thể cài đặtscipy như,

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

Cách khác, bạn cũng có thể cài đặt mô-đun python bằng cách được python-pipđề xuất bởi Zack Titan trong nhận xét bên dưới , Để cài đặt, numpybạn có thể sử dụng

pip install numpy

Cảnh báo: Rất khuyến khích cài đặt các mô-đun python chỉ sử dụng kho lưu trữ Ubuntu chính thức và không sử dụng pipphương thức này như siêu người dùng (nghĩa là, roothoặc sử dụng sudo). Trong một số trường hợp, nó có thể khiến hệ thống của bạn không sử dụng được bằng cách phá vỡ hệ thống python.

Cách cài đặt các gói sử dụng pipvào môi trường ảo cục bộ.


Giống như trong mô-đun toán học câu trả lời của bạn tồn tại và đối với numby, trac trở lại không xuất hiện và cho echo $? đầu ra là 0, điều đó có nghĩa là numpy cũng có mặt trong hệ thống của tôi?
TechJhola

1
Vâng, nó có trong hệ thống của bạn.
souravc

Trong trường hợp bạn không có mô-đun numpy, bạn sẽ nhập nó như thế nào? Khi chúng tôi thực hiện mã hóa, chúng tôi gọi câu lệnh nhập bằng cách nhập numpy *, nó có cài đặt mô-đun không? Nếu không làm thế nào chúng ta sẽ cài đặt một mô-đun mới?
TechJhola

1
Nó sẽ là một câu hỏi kín làm thế nào để cài đặt một mô-đun. Cần các gói khác nhau cho các mô-đun khác nhau. Ví dụ: để cài đặt, vpythonbạn cần cài đặt nó dưới dạngsudo apt-get install python-visual libgtkglextmm-x11-1.2-dev
souravc

1
không sử dụng sudo pip; nó có thể phá vỡ hệ thống python. Sử dụng apt-get để cài đặt các gói cho hệ thống python. Bạn có thể sử dụng pip --usertùy chọn hoặc virtualenv để cài đặt các gói Python cho chính mình.
jfs

21

Trong trường hợp chúng tôi không muốn nhập một mô-đun không mong muốn (điều này sẽ xảy ra trong một trytuyên bố), chúng tôi có thể sử dụng sys.modulesđể kiểm tra các mô-đun đã được cài đặt được nhập trước đó.

Trong vấn đề vỏ trăn:

>>> import sys

Sau đó kiểm tra các mô-đun đã cài đặt:

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

Lưu ý rằng chỉ những mô-đun đã được nhập trước khi đưa ra Truethử nghiệm này, tất cả các mô-đun khác (ngay cả khi đã cài đặt) đều dẫn đếnFalse.

Một cách khác để thay thế trymột importcâu lệnh trong bảng điều khiển python là gọi help()hàm inbuilt . Điều này sẽ không cung cấp tài liệu cho các mô-đun không được cài đặt, ví dụ:

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

Đầu ra của các tài liệu trợ giúp rất dài của các mô-đun được cài đặt có thể bị gián đoạn Q.

Bây giờ để cài đặt các mô-đun bị thiếu, nên sử dụng quản lý gói Ubuntu (chứ không phải theo cách thức của Python) vì chúng tôi cần quyền truy cập root và cũng để tránh làm rối hệ thống phụ thuộc nhiều vào Python của chúng tôi. Đối với các mô-đun trong câu hỏi này, ví dụ, sẽ là:

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

Sau khi cài đặt, chúng tôi có thể thêm chúng vào sys.modulestừ điển bằng cách nhập chúng một lần.


1
Tôi nghĩ rằng đây là câu trả lời Pythonic nhất ....
Grijesh Chauhan

3
Phần đầu tiên của điều này là sai: sys.moduleschỉ chứa các mô-đun đã được nhập , vì vậy đây không phải là cách đáng tin cậy để kiểm tra xem mô-đun đã được cài đặt chưa. Thử nghiệm đáng tin cậy nhất là sử dụng try/exceptvà bẫy ImportError, như một số người khác đã đề xuất.
ekhumoro

@ekhumoro - cảm ơn, tôi sẽ chỉnh sửa câu trả lời của mình để làm cho nó rõ ràng hơn.
Takkat

4
Nó dường như vẫn chưa đủ rõ ràng. Cho rằng câu hỏi là làm thế nào để tìm hiểu xem một mô-đun đã được cài đặt (không được nhập ), sys.moduleshoàn toàn không liên quan và tôi nghĩ rằng bất kỳ đề cập nào về nó là sai lệch. Nhưng có lẽ đó chỉ là tôi.
David Z

1
sys.moduleskhông có sự giúp đỡ nào ở đây
con mèo

19

Một cách khác là pkgutilmô-đun. Hoạt động với cả Python 2 & 3:

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

Bạn cần thay thế modulebằng tên của mô-đun của bạn, ví dụ:

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

2
Tôi thấy bạn đã gỡ bỏ một số thay đổi của tôi; print()cũng sẽ hoạt động tốt trong Python 2; Nó được coi là cú pháp theo nhóm với parens và không có bất kỳ tác dụng phụ nào. Chỉ khi bạn muốn thêm nhiều mục (như trong print('a', 'b')đó sẽ được coi là một tuple, trong đó bạn cần from __future__ import print_function, nhưng điều đó không áp dụng trong trường hợp này, bạn chỉ có thể viết mã tương thích chuyển tiếp bằng cách thêm các dấu ngoặc (Tôi đã kiểm tra các thay đổi của tôi trong Python 2 và 3).
Martin Tournoij 23/2/2015

@Carpetsmoker: Cảm ơn bạn đã chỉ ra. Tôi quay trở lại phiên bản cũ.
cuonglm

Đây là một câu trả lời tuyệt vời. Tôi đã thêm một câu trả lời phái sinh trả về mã thoát / mã trạng thái (cho điều khiển luồng kịch bản lệnh shell) và lấy tên mô-đun làm đối số dòng lệnh. Askubfox.com/a/891384/146273
Bruno Bronosky

Điều đó đã làm việc! - Chỉ cần thay đổi để exitcó thể sử dụng nó trong bối cảnh shell:python -c 'import pkgutil; exit(0 if pkgutil.find_loader("math") else 2)'
AT

12

Tôi biết OP ban đầu yêu cầu một giải pháp sau khi khởi động Python, nhưng bên ngoài python tôi sử dụng pip. Trên Ubuntu : sudo apt-get install python-pip, nếu nó chưa được cài đặt.

Sau đó, để xem các mô-đun bên thứ ba có sẵn, chỉ cần chạy:

pip freeze

Hoặc thậm chí

pip list

Và cả hai sẽ cho bạn thấy tất cả các mô-đun được cài đặt và các phiên bản của chúng.

Nếu mô-đun bạn đang tìm kiếm không được cài đặt, hầu hết thời gian bạn có thể dễ dàng cài đặt nó với pip:

pip install <module-name>

Nếu bạn không chắc chắn liệu một mô-đun tồn tại hay tên PyPI của nó là gì, hãy sử dụng pip search:

pip search <keyword>

1
Ngoài ra, pip show <module-name>sẽ hiển thị cho dù một gói được cài đặt, ví dụ pip show numpy.
Kỹ sư Herpes miễn phí

10

Bạn có thể đặt mã bên trong try, exceptchặn.

$ 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

6

Để cung cấp một câu trả lời khác, vì lợi ích của hoàn thành:

Bạn có thể (ab) sử dụng -mtùy chọn. Từ trang của Python:

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

Điều này sẽ cho chúng ta:

$ 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

Nhưng đối với các mô-đun không tồn tại, nó sẽ cung cấp cho chúng tôi:

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

Chúng ta có thể sử dụng grepđể khớp với điều này:

$ 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

Đây là một chút hack-ish, và không phải -mlà những gì đã được dự định; nhưng đó là phương pháp yêu cầu gõ ít nhất nếu bạn muốn kiểm tra nhanh :-)


4
grep -qlàm cho chuyển hướng đến null không cần thiết.
muru

3
@muru Yike! Tôi đã gõ rất nhiều chuyển hướng vô dụng /dev/nulltrong những năm qua: - /
Martin Tournoij

4

Tôi đã viết một ví dụ bằng Python:

import pip
import sys
from bigml.api import BigML


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

3

Kiểm tra Shell oneliner (hữu ích cho việc cung cấp)

Tôi thấy rằng để làm cho việc cung cấp cơ sở hạ tầng của mình ** bình thường, tôi cần có thể kiểm tra một gói từ vỏ trong một oneliner. Tôi xây dựng trên câu trả lời của @ cuonglm. Tôi đã phải đảo ngược 10vì tôi đang tạo một trạng thái thoát hơn là in một chuỗi.

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

Bạn có thể thay thế sys.argv[1]bằng tên được trích dẫn duy nhất của gói của bạn, nhưng đối với các tập lệnh cung cấp của tôi, tôi thích tính dễ đọc của nó ở cuối.

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

** Tôi nhận ra rằng đầu bếp , con rốivô hình đều có plugin để quản lý các gói python, nhưng bạn có thể thấy mình trong tình huống như tôi khi bạn đang sử dụng một phiên bản lỗi thời và không muốn sử dụng các plugin không dùng nữa.


1

Người ta cũng có thể sử dụng pydoc modules, có thể được lọc grepđể tìm một mô-đun cụ thể. Đầu ra được hiển thị ở định dạng cột. Nhược điểm duy nhất của phương pháp này là nó cũng sẽ bao gồm các tệp python trong thư mục làm việc hiện tại. Tuy nhiên, tôi sử dụng nó hầu hết thời gian và đó là một trong những cách tiếp cận được trích dẫn nhiều cho câu hỏi liên quan này: https://stackoverflow.com/q/739993/3701431


0

Từ Ubuntu Shell, theo mặc định bash, đơn giản như

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

Ví dụ

pip list | grep pywinrm

pip list | grep numpy

Và, nếu bạn có nghi ngờ về trường hợp này (mặc dù tôi nghĩ rằng tất cả các tên gói luôn là chữ thường):

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

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.