web-dev-qa-db-ja.com

モジュールが存在するかどうかを確認し、存在しない場合はインストールします

モジュールが存在するかどうかを確認します。存在しない場合は、インストールします。

どうすればよいですか?

これまでのところ、モジュールが存在しない場合にfを正しく出力するこのコードがあります。

try:
    import keyring
except ImportError:
    print 'f'
24
dotty

これがどのように行われるべきかです、そして私が間違っているならば、私を訂正してください。しかし、Noufalはこの質問に対する別の回答でそれを確認しているようですので、それは正しいと思います。

自分が書いたいくつかのスクリプトのsetup.pyスクリプトを作成するとき、必要なライブラリをインストールするために、ディストリビューションのパッケージマネージャーに依存していました。

だから、私のsetup.pyファイルで、これを行いました:

package = 'package_name'
try:
    return __import__(package)
except ImportError:
    return None

package_nameがインストールされている場合は、続行してください。それ以外の場合は、subprocessを使用して呼び出したパッケージマネージャーを介してインストールします。

13
user225312
import pip

def import_or_install(package):
    try:
        __import__(package)
    except ImportError:
        pip.main(['install', package])       

このコードは、パッケージがタイプstrであるパッケージのインポートを試み、それができない場合は、pipを呼び出してそこからインストールを試みます。

22
ewil

この動的インポートのアプローチは、モジュールがインストールされていない場合にメッセージを出力するだけの場合に非常に有効です。モジュールの自動インストール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'])
11
Frangossauro

次のようにos.systemを使用できます。

import os

package = "package_name"

try:
    __import__package
except:
    os.system("pip install "+ package)
1
lsr729

pip install %s"%keyring exceptの部分でこれを行いますが、お勧めしません。正しい方法は、 distutils を使用してアプリケーションをパッケージ化し、インストール時に依存関係が取り込まれるようにすることです。

1
Noufal Ibrahim

すべてのモジュールをそれほど簡単にインストールできるわけではありません。それらのすべてが簡単なインストールのサポートを備えているわけではありません。それらをビルドすることによってのみインストールできるものもあります。その他のものは、gccのようなPython以外の前提条件を必要とします。

だから私はあなたがおそらくそれをいくつかのあらかじめ決められたモジュールで動作させることができると言いますが、それがどんなモジュールでも動作する一般的なものになる可能性はありません。

0
Assaf Lavie