web-dev-qa-db-ja.com

Pythonパッケージがインストールされているかどうかを確認してください

Pythonスクリプト内でパッケージがインストールされているかどうかを確認する良い方法は何ですか?インタープリターからは簡単ですが、スクリプト内で行う必要があります。

インストール中に作成されたディレクトリがシステム上にあるかどうかを確認できたと思いますが、もっと良い方法があると感じています。 Skype4Pyパッケージがインストールされていることを確認しようとしています。インストールされていない場合はインストールします。

チェックを達成するための私のアイデア

  • 通常のインストールパスでディレクトリを確認します
  • パッケージをインポートして、例外がスローされた場合はパッケージをインストールしてください
85
Kevin

pythonスクリプトを意味する場合は、次のようにします。

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

更新された回答

これを行うより良い方法は次のとおりです。

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

なぜこのように?アプリ名の衝突が発生する場合があります。アプリの名前空間からインポートしても、システムにインストールされているものの全体像はわかりません。

古い答え

これを行うより良い方法は次のとおりです。

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
46

Python 3.3では、 find_spec() メソッドを使用できます

import importlib.util
import sys

# For illustrative purposes.
package_name = 'pandas'

spec = importlib.util.find_spec(package_name)
if spec is None:
    print(package_name +" is not installed")
20
ice.nicer

ターミナルからチェックしたい場合は、実行することができます

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
18
Ognjen Vukovic

この答え の拡張として:

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: [email protected]
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
5
KutalmisB

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 moduleとa python package。には違いがあります。パッケージには複数のモジュールを含めることができ、モジュール名はパッケージ名と一致しない場合があります。

2
Lyudmil Nenov

このトピックに自分の考えや発見をいくつか加えたいと思います。カスタムメイドプログラムのすべての要件をチェックするスクリプトを書いています。 pythonモジュールも含む多くのチェックがあります。

には小さな問題があります

try:
   import ..
except:
   ..

解決。私の場合、pythonモジュールはpython-nmapと呼ばれますが、import nmapでインポートすると、名前が一致しないので、上記のソリューションを使用したテストは戻ります。偽の結果であり、ヒット時にモジュールもインポートしますが、単純なテスト/チェックのために多くのメモリを使用する必要はないかもしれません。

私もそれを見つけました

import pip
installed_packages = pip.get_installed_distributions()

installed_packagesが持つパッケージのみがpipでインストールされます。私のシステムでは、pip freeze40 pythonモジュールを返しますが、installed_packagesには手動でインストールした1しかありません(python-nmap )。

私がそれを知っている以下の別の解決策質問に関連しない可能性がある、しかし、テスト機能を分離するをインストールを実行するものとは良い習慣だと思います一部の人にとっては便利です。

私のために働いた解決策。この答えに基づいて pythonモジュールをインポートせずに存在するかどうかを確認する方法

from imp import find_module

def checkPythonmod(mod):
    try:
        op = find_module(mod)
        return True
    except ImportError:
        return False

注:このソリューションでは、python-nmapという名前のモジュールも見つけることができません。代わりにnmapを使用する必要があります(簡単に共存できます)が、この場合、モジュールはメモリは何でも。

1
Gergely 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
$
0
Deepu Sahni

スクリプトで不足しているパッケージをインストールして続行したい場合は、次のようなことができます(「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))
0
Alexander Zhak