モジュールが存在するかどうかを確認します。存在しない場合は、インストールします。
どうすればよいですか?
これまでのところ、モジュールが存在しない場合にf
を正しく出力するこのコードがあります。
try:
import keyring
except ImportError:
print 'f'
これがどのように行われるべきかです、そして私が間違っているならば、私を訂正してください。しかし、Noufalはこの質問に対する別の回答でそれを確認しているようですので、それは正しいと思います。
自分が書いたいくつかのスクリプトのsetup.py
スクリプトを作成するとき、必要なライブラリをインストールするために、ディストリビューションのパッケージマネージャーに依存していました。
だから、私のsetup.py
ファイルで、これを行いました:
package = 'package_name'
try:
return __import__(package)
except ImportError:
return None
package_name
がインストールされている場合は、続行してください。それ以外の場合は、subprocess
を使用して呼び出したパッケージマネージャーを介してインストールします。
import pip
def import_or_install(package):
try:
__import__(package)
except ImportError:
pip.main(['install', package])
このコードは、パッケージがタイプstrであるパッケージのインポートを試み、それができない場合は、pipを呼び出してそこからインストールを試みます。
この動的インポートのアプローチは、モジュールがインストールされていない場合にメッセージを出力するだけの場合に非常に有効です。モジュールの自動インストールSHOULD N'Tは、subprocess
を介してpipを発行するように実行されます。それが、私たちがsetuptools(または配布)を持っている理由です。
パッケージに関する素晴らしいチュートリアルがいくつかあり、依存関係の検出/インストールのタスクはinstall_requires=[ 'FancyDependency', 'otherFancy>=1.0' ]
。それだけです!
しかし、もし本当に[〜#〜] need [〜#〜]を手動で行う場合は、setuptools
を使用して支援できます。
from pkg_resources import WorkingSet , DistributionNotFound
working_set = WorkingSet()
# Printing all installed modules
print Tuple(working_set)
# Detecting if module is installed
try:
dep = working_set.require('paramiko>=1.0')
except DistributionNotFound:
pass
# Installing it (anyone knows a better way?)
from setuptools.command.easy_install import main as install
install(['Django>=1.2'])
次のようにos.system
を使用できます。
import os
package = "package_name"
try:
__import__package
except:
os.system("pip install "+ package)
pip install %s"%keyring
exceptの部分でこれを行いますが、お勧めしません。正しい方法は、 distutils を使用してアプリケーションをパッケージ化し、インストール時に依存関係が取り込まれるようにすることです。
すべてのモジュールをそれほど簡単にインストールできるわけではありません。それらのすべてが簡単なインストールのサポートを備えているわけではありません。それらをビルドすることによってのみインストールできるものもあります。その他のものは、gccのようなPython以外の前提条件を必要とします。
だから私はあなたがおそらくそれをいくつかのあらかじめ決められたモジュールで動作させることができると言いますが、それがどんなモジュールでも動作する一般的なものになる可能性はありません。