[英]Check if Python Package is installed
在 Python 腳本中檢查包是否安裝的好方法是什么? 我知道解釋器很容易,但我需要在腳本中完成。
我想我可以檢查系統上是否有安裝過程中創建的目錄,但我覺得有更好的方法。 我正在嘗試確保安裝了 Skype4Py 包,如果沒有,我將安裝它。
我完成檢查的想法
如果您的意思是 python 腳本,只需執行以下操作:
import importlib.util
import sys
# For illustrative purposes.
name = 'itertools'
if name in sys.modules:
print(f"{name!r} already in sys.modules")
elif (spec := importlib.util.find_spec(name)) is not None:
# If you choose to perform the actual import ...
module = importlib.util.module_from_spec(spec)
sys.modules[name] = module
spec.loader.exec_module(module)
print(f"{name!r} has been imported")
else:
print(f"can't find the {name!r} module")
try:
import mymodule
except ImportError as e:
pass # module doesn't exist, deal with it.
try:
import mymodule
except ImportError, e:
pass # module doesn't exist, deal with it.
一個更好的方法是:
import subprocess
import sys
reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze'])
installed_packages = [r.decode().split('==')[0] for r in reqs.split()]
結果:
print(installed_packages)
[
"Django",
"six",
"requests",
]
檢查requests
是否已安裝:
if 'requests' in installed_packages:
# Do something
為什么這樣? 有時您會遇到應用名稱沖突。 從應用程序命名空間導入並不能讓您全面了解系統上安裝的內容。
請注意,建議的解決方案有效:
pip install http://some.site/package-name.zip
或任何其他存檔類型)安裝時。python setup.py install
手動python setup.py install
。sudo apt install python-requests
。情況下,當它可能無法正常工作:
python setup.py develop
。pip install -e /path/to/package/source/
。一個更好的方法是:
import pip
installed_packages = pip.get_installed_distributions()
對於 pip>=10.x 使用:
from pip._internal.utils.misc import get_installed_distributions
為什么這樣? 有時您會遇到應用名稱沖突。 從應用程序命名空間導入並不能讓您全面了解系統上安裝的內容。
結果,您將獲得pkg_resources.Distribution
對象的列表。 請參閱以下示例:
print installed_packages
[
"Django 1.6.4 (/path-to-your-env/lib/python2.7/site-packages)",
"six 1.6.1 (/path-to-your-env/lib/python2.7/site-packages)",
"requests 2.5.0 (/path-to-your-env/lib/python2.7/site-packages)",
]
列一個清單:
flat_installed_packages = [package.project_name for package in installed_packages]
[
"Django",
"six",
"requests",
]
檢查requests
是否已安裝:
if 'requests' in flat_installed_packages:
# Do something
從 Python 3.3 開始,您可以使用find_spec()方法
import importlib.util
# For illustrative purposes.
package_name = 'pandas'
spec = importlib.util.find_spec(package_name)
if spec is None:
print(package_name +" is not installed")
如果你想從終端進行檢查,你可以運行
pip3 show package_name
如果沒有返回任何內容,則表示未安裝該軟件包。
如果您想自動執行此檢查,例如,如果丟失,您可以安裝它,您可以在 bash 腳本中包含以下內容:
pip3 show package_name 1>/dev/null #pip for Python 2
if [ $? == 0 ]; then
echo "Installed" #Replace with your actions
else
echo "Not Installed" #Replace with your actions, 'pip3 install --upgrade package_name' ?
fi
作為此答案的擴展:
對於 Python 2.*, pip show <package_name>
將執行相同的任務。
例如pip show numpy
將返回以下內容或類似內容:
Name: numpy
Version: 1.11.1
Summary: NumPy: array processing for numbers, strings, records, and objects.
Home-page: http://www.numpy.org
Author: NumPy Developers
Author-email: numpy-discussion@scipy.org
License: BSD
Location: /home/***/anaconda2/lib/python2.7/site-packages
Requires:
Required-by: smop, pandas, tables, spectrum, seaborn, patsy, odo, numpy-stl, numba, nfft, netCDF4, MDAnalysis, matplotlib, h5py, GridDataFormats, dynd, datashape, Bottleneck, blaze, astropy
打開您的命令提示符類型
pip3 list
您可以使用 setuptools 中的 pkg_resources 模塊。 例如:
import pkg_resources
package_name = 'cool_package'
try:
cool_package_dist_info = pkg_resources.get_distribution(package_name)
except pkg_resources.DistributionNotFound:
print('{} not installed'.format(package_name))
else:
print(cool_package_dist_info)
請注意,python 模塊和 python 包之間存在差異。 一個包可以包含多個模塊,並且模塊的名稱可能與包名稱不匹配。
在終端類型
pip show some_package_name
例子
pip show matplotlib
if pip list | grep -q \^'PACKAGENAME\s'
# installed ...
else
# not installed ...
fi
我想在這個主題中添加一些我的想法/發現。 我正在編寫一個腳本來檢查定制程序的所有要求。 python模塊也有很多檢查。
有一點小問題
try:
import ..
except:
..
解決方案。 在我的例子中,一個名為python-nmap
的 python 模塊,但你使用import nmap
導入它,並且你看到名稱不匹配。 因此,上述解決方案的測試返回 False 結果,並且它還在命中時導入模塊,但可能不需要使用大量內存來進行簡單的測試/檢查。
我也發現
import pip
installed_packages = pip.get_installed_distributions()
installed_packages
將僅包含已使用 pip 安裝的軟件包。 在我的系統pip freeze
返回超過40
python 模塊,而installed_packages
只有1
,我手動安裝的一個 (python-nmap)。
下面的另一種解決方案我知道它可能與問題無關,但我認為將測試功能與執行安裝的功能分開是一個很好的做法,它可能對某些人有用。
對我有用的解決方案。 它基於這個答案How to check if a python module exist without importing it
from imp import find_module
def checkPythonmod(mod):
try:
op = find_module(mod)
return True
except ImportError:
return False
注意:此解決方案也找不到名稱為python-nmap
的模塊,我必須改用nmap
(易於使用),但在這種情況下,該模塊不會被加載到內存中。
你可以使用這個:
class myError(exception):
pass # Or do some thing like this.
try:
import mymodule
except ImportError as e:
raise myError("error was occurred")
如果您希望腳本安裝缺少的包並繼續,您可以執行以下操作(以“python-krbV”包中的“krbV”模塊為例):
import pip
import sys
for m, pkg in [('krbV', 'python-krbV')]:
try:
setattr(sys.modules[__name__], m, __import__(m))
except ImportError:
pip.main(['install', pkg])
setattr(sys.modules[__name__], m, __import__(m))
一個快速的方法是使用python命令行工具。 只需鍵入import <your module name>
如果模塊丟失,您會看到錯誤。
$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
>>> import sys
>>> import jocker
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named jocker
$
嗯......我看到的最接近方便的答案是使用命令行嘗試導入。 但我更願意避免這種情況。
'pip freeze 怎么樣? grep pkgname'? 我試過了,效果很好。 它還向您顯示它的版本以及它是在版本控制(安裝)還是可編輯(開發)下安裝。
我想對@ice.nicer 的回復發表評論,但我不能,所以......我的觀察是,帶破折號的包用下划線保存,而不僅僅是@dwich 評論指出的點
例如,您執行pip3 install sphinx-rtd-theme
,但是:
importlib.util.find_spec(sphinx_rtd_theme)
返回一個對象importlib.util.find_spec(sphinx-rtd-theme)
返回 Noneimportlib.util.find_spec(sphinx.rtd.theme)
引發 ModuleNotFoundError 此外,有些名稱已完全更改。 例如,您執行pip3 install pyyaml
但它被簡單地保存為yaml
我正在使用 python3.8
使用pip3 list命令搜索包是否存在的天氣
#**pip3 list** will display all the packages and **grep** command will search for a particular package
pip3 list | grep your_package_name_here
您可以使用導入錯誤
try:
import your_package_name
except ImportError as error:
print(error,':( not found')
!pip install your_package_name
import your_package_name
...
...
轉到選項 #2。 如果拋出ImportError
,則該包未安裝(或不在sys.path
)。
有沒有機會使用下面給出的片段? 當我運行此代碼時,它返回“未安裝模塊熊貓”
a = "pandas"
try:
import a
print("module ",a," is installed")
except ModuleNotFoundError:
print("module ",a," is not installed")
但是當我運行下面給出的代碼時:
try:
import pandas
print("module is installed")
except ModuleNotFoundError:
print("module is not installed")
它返回“安裝了模塊熊貓”。
它們之間有什么區別?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.