web-dev-qa-db-ja.com

モジュールがPythonにインストールされているかどうかを確認し、インストールされていない場合は、コード内にインストールしますか?

私のコードにモジュール「mutagen」と「gTTS」をインストールしたいのですが、モジュールを持たないすべてのコンピューターにモジュールがインストールされるようにしたいのですが、もしそうならインストールしようとしませんそれらは既にインストールされています。私は現在持っています:

def install(package):
    pip.main(['install', package])

install('mutagen')

install('gTTS')

from gtts import gTTS
from mutagen.mp3 import MP3

ただし、既にモジュールを持っている場合は、プログラムを開くたびに不要な混乱がプログラムの先頭に追加されます。

9
Gameskiller01

パッケージが存在するかどうかを確認し、後者の場合にインストールするには、pipモジュールを使用してみてください。

出力を非表示にするには、そのための関数を作成する必要があります(この post のコードから)。

from contextlib import contextmanager
import sys, os

@contextmanager
def suppress_stdout():
    with open(os.devnull, "w") as devnull:
        old_stdout = sys.stdout
        sys.stdout = devnull
        try:  
            yield
        finally:
            sys.stdout = old_stdout

import pip

required_pkgs = ['mutagen', 'gTTS']
installed_pkgs = [pkg.key for pkg in pip.get_installed_distributions()]

for package in required_pkgs:
    if package not in installed_pkgs:
        with suppress_stdout():
            pip.main(['install', package])

または、別の方法は、単純なtryexceptを使用することです。

import pip

pkgs = ['mutagen', 'gTTS']
for package in pkgs:
    try:
        import package
    except ImportError, e:
        pip.main(['install', package])

前述の@zwerのように、上記は機能しますが、プロジェクトをパッケージ化する適切な方法とは見なされません。これをより詳しく見るには、ページを読んでください パッケージ化の方法Python App

11
theGirrafish

別の解決策は、あなたがtry/exceptブロックにインポートしようとしているもののインポートステートメントを置くことです。それが動作する場合はインストールされますが、そうでない場合は例外をスローし、コマンドを実行してインストールすることができます。

2
Joseph Long

コマンドラインを使用できます:

python -m MyModule

モジュールが存在するかどうかがわかります

それ以外の場合は、単にベストプラクティスを使用できます。

pip freeze> requirements.txt

それはあなたが持っているモジュールをあなたに置きますpythonインストール

および:

pip install -r requirements.txt

それらをロードする

自動的に目的になります

楽しむ

1
D. Peter
pip list | grep <module_name_you_want_to_check>

上記がその答えです。

pip list

すべてのモジュールをリストし、

grep <module_name_you_want_to_check>

リストからキーワードを見つけます。私のために働く。

0
jack