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",
]
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: [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
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。には違いがあります。パッケージには複数のモジュールを含めることができ、モジュール名はパッケージ名と一致しない場合があります。
このトピックに自分の考えや発見をいくつか加えたいと思います。カスタムメイドプログラムのすべての要件をチェックするスクリプトを書いています。 pythonモジュールも含む多くのチェックがあります。
には小さな問題があります
try:
import ..
except:
..
解決。私の場合、pythonモジュールはpython-nmap
と呼ばれますが、import nmap
でインポートすると、名前が一致しないので、上記のソリューションを使用したテストは戻ります。偽の結果であり、ヒット時にモジュールもインポートしますが、単純なテスト/チェックのために多くのメモリを使用する必要はないかもしれません。
私もそれを見つけました
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コマンドラインツールを使用することです。単に「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
$
スクリプトで不足しているパッケージをインストールして続行したい場合は、次のようなことができます(「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))