質問

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

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

チェックを完了するための私のアイデア

  • 一般的なインストール パス内のディレクトリを確認します。
  • パッケージをインポートして例外がスローされた場合は、パッケージをインストールします
役に立ちましたか?

解決

あなたはPythonスクリプトを意味する場合は、ちょうどこのような何かをします:

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

なぜ、この方法は?時には、あなたはアプリの名前の衝突を持っています。アプリの名前空間からインポートすると、あなたのシステムにインストールされているものの全体像を与えるものではありません。

旧答え

これを行うには良い方法があります:

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",
]

<=>がインストールされているかどうかをチェックします:

if 'requests' in flat_installed_packages:
    # Do something

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

あなたは、端末からのチェックをしたい場合は、あなたが実行することができます。

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

あなたは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パッケージとの間に差があることに留意されたいです。パッケージには、複数のモジュールを含むことができ、モジュールの名前は、パッケージ名と一致しない場合があります。

このトピックについて、私の考えや発見をいくつか追加したいと思います。カスタムメイドのプログラムのすべての要件をチェックするスクリプトを作成しています。Pythonモジュールを使ったチェックもたくさんあります。

ちょっとした問題がありますが、

try:
   import ..
except:
   ..

解決。私の場合、Python モジュールの 1 つが呼び出されます python-nmap, 、しかし、あなたはそれをインポートします import nmap ご覧のとおり、名前が一致しません。したがって、上記のソリューションを使用したテストは False 結果を返し、ヒット時にモジュールもインポートしますが、単純なテスト/チェックには多くのメモリを使用する必要はありません。

私もそれを発見しました

import pip
installed_packages = pip.get_installed_distributions()

installed_packages 持つだろう パッケージのみが変更されました pipでインストール。私のシステムでは pip freeze 戻ってきます 40 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 代わりに (使いやすい) ただし、この場合、モジュールはメモリにまったくロードされません。

あなたが不足しているパッケージをインストールして続行するにはあなたのスクリプトを希望する場合は、あなたが(「の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))

簡単な方法は、使用することです パイソン コマンドラインツール。シンプルに入力してください 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
$

オプション#2を移動します。 ImportErrorがスローされた場合は、パッケージがインストールされていない(あるいはないsys.path)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top