Câu trả lời:
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
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, numpy
bạ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 pip
phương thức này như siêu người dùng (nghĩa là, root
hoặ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.
vpython
bạn cần cài đặt nó dưới dạngsudo apt-get install python-visual libgtkglextmm-x11-1.2-dev
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 --user
tùy chọn hoặc virtualenv để cài đặt các gói Python cho chính mình.
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 try
tuyên bố), chúng tôi có thể sử dụng sys.modules
để kiểm tra các mô-đun đã được cài đặt và đượ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 True
thử 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ế try
một import
câ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.modules
từ điển bằng cách nhập chúng một lần.
sys.modules
chỉ 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/except
và bẫy ImportError
, như một số người khác đã đề xuất.
sys.modules
hoà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.
sys.modules
không có sự giúp đỡ nào ở đây
Một cách khác là pkgutil
mô-đ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ế module
bằ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
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).
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>
pip show <module-name>
sẽ hiển thị cho dù một gói được cài đặt, ví dụ pip show numpy
.
Bạn có thể đặt mã bên trong try
, except
chặ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
Để 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 -m
tù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 -m
là 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 :-)
grep -q
làm cho chuyển hướng đến null không cần thiết.
/dev/null
trong những năm qua: - /
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'])
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 1
và 0
vì 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ối và vô 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.
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
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 viết bài này, pip show ...
dường như là cách dễ nhất:
https://pip.pypa.io/en/urdy/reference/pip_show/
Nhưng nó là im lặng (tức là không trả về gì) khi gói không được cài đặt.