簡體   English   中英

檢查是否安裝了 Python 包

[英]Check if Python Package is installed

在 Python 腳本中檢查包是否安裝的好方法是什么? 我知道解釋器很容易,但我需要在腳本中完成。

我想我可以檢查系統上是否有安裝過程中創建的目錄,但我覺得有更好的方法。 我正在嘗試確保安裝了 Skype4Py 包,如果沒有,我將安裝它。

我完成檢查的想法

  • 檢查典型安裝路徑中的目錄
  • 嘗試導入包,如果拋出異常,則安裝包

如果您的意思是 python 腳本,只需執行以下操作:

Python 3.3+ 使用 sys.modules 和find_spec

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")

蟒蛇3:

try:
    import mymodule
except ImportError as e:
    pass  # module doesn't exist, deal with it.

蟒蛇2:

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 從 PyPI 或任何其他替代來源(如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)返回 None
  • importlib.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM