コード内にPythonモジュールをインストールする


310

スクリプト内でPyPiから直接パッケージをインストールする必要があります。たぶん、いくつかのモジュールまたはありますdistutilsdistributepip私は同じようなものを実行することを可能にするなど)の機能pypi.install('requests')と要求は私のvirtualenvのにインストールされます。


4
独自のパッケージのsetup.pyで、関連するモジュールを依存関係として定義しないのはなぜですか?
Andreas Jung

5
あなたは知っています...実際に行われるはずの方法...しかし、常にos.system( "pip install blah")することができますが、sudoアクセスが必要になる場合があります...セットアップで依存関係にするだけの方が良いでしょう。 py
Joran Beasley、

2
受け入れられた回答をここで変更することを検討しますか?インポートpipは決して良い考えではありません-その内容のすべてが_internalバージョン10から始まっているという単なる事実...
Antti Haapala

2
@chuwy stackoverflow.com/a/50255019/918959 <=これ。pip._internalはインポートできるようには設計されていません。別のプログラムにインポートすると、完全にランダムな処理を実行できます。
Antti Haapala

3
@AnttiHaapala大丈夫私はそれを変更しました。私は個人的にどちらのソリューションも好きではありませんが、私は最近Pythonから遠く離れているので、あなたの意見を信じます。
chuwy

回答:


254

スクリプトからパッケージをインストールするために公式に推奨される方法は、サブプロセスを介してpipのコマンドラインインターフェイスを呼び出すことです。ここに示されている他のほとんどの回答は、pipではサポートされていません。さらに、pip v10以降、pip._internalユーザーにプログラムによるpipの使用が許可されていないことを明確にするために、すべてのコードが正確に移動されました。

現在のランタイムに関連付けられたものとsys.executable同じものを確実に呼び出すために使用しpipます。

import subprocess
import sys

def install(package):
    subprocess.check_call([sys.executable, "-m", "pip", "install", package])

これに関する1つの問題は、Windowsの初心者ユーザーの場合、pythonとpipが常にPATHにあるとは限らないため、ダブルクリックできる.pyファイルが非常に便利であるのに対し、「pip install xxx」コメントはかなりトリッキーです。
jdpipe

CalledProcessError:コマンド '[' C:\\ ProgramData \\ Anaconda3 \\ pythonw.exe '、' -m '、' pip '、' install '、' googleapiclient ']'がゼロ以外の終了ステータス1を
返しました

383

次のようなものも使用できます。

import pip

def install(package):
    if hasattr(pip, 'main'):
        pip.main(['install', package])
    else:
        pip._internal.main(['install', package])

# Example
if __name__ == '__main__':
    install('argh')

3
@nbro pip.main()コマンドラインと同じようにオプションを渡します(ただし、各オプションは、単一の文字列ではなく、リスト内の個別のエントリとして)。また、必要なパッケージのバージョンを指定するには、コマンドラインと同じようにします。例:pip.main(['install', 'pip==7.1.0'])
Kaos

3
stackoverflow.com/questions/6457794/…も参照してください。これは、インストールが失敗した場合の処理​​方法を示しています。
P.マイヤーノア

25
from pip._internal import main as pipmainあなたが使用することができるpipmain()だけで推奨されないようにpip.main()参照のstackoverflow.com/questions/43398961/...
Bjorksのナンバーワンファン

17
現在は廃止されています。
モールス

6
理由により廃止され、推奨されなくなりました。pip.pypa.io/en/latest/user_guide/#using-pip-from-your-program
NBK

71

を使用pipして必要なパッケージをインストールし、インストール後にそれをインポートする場合は、次のコードを使用できます。

def install_and_import(package):
    import importlib
    try:
        importlib.import_module(package)
    except ImportError:
        import pip
        pip.main(['install', package])
    finally:
        globals()[package] = importlib.import_module(package)


install_and_import('transliterate')

ユーザーとしてパッケージをインストールした場合、パッケージをインポートするだけでは問題が発生する可能性があります。sys.pathを更新する方法を参照してください詳細については。


4
Python 3でそれを行う方法はありますか?imp.reload(site)私を取得しますRuntimeError: dictionary changed size during iteration
kgadek

これはどこにパッケージをインストールしますか?これを実行した後、実行できませんpip uninstall <package_name>でした。を使用してアンインストールすることはできますpip.mainが、パッケージをどこにインストールするのか知りたいだけですか?
Ishan Khare

気になった。私がやればこれは正しく動作しますpip install requests[security]か?それが適切にグローバルを正しく定義するかどうかはわかりませんでした。
Fallenreaper

4
時代遅れ。 pip.main動作しなくなりました。 pip.pypa.io/en/latest/user_guide/#using-pip-from-your-program
wim

23

これはうまくいくはずです:

import subprocess

def install(name):
    subprocess.call(['pip', 'install', name])

1
はい、間違いなく動作するはずです。しかし、私はもっとエレガントな方法があると思いました;)私は少し待っているでしょう、あるかもしれません。
chuwy

1
@Downvoter:私の答えの何が問題になっていますか?この答えには、必要なOPがすべて含まれています。シェルも使用していません。
クォンタム

13
パスの最初にあるpipの正しいバージョンに依存します。ユーザーが代替のPythonインストールを実行している場合、pipは現在のインストールではなく最初のインストールにインストールします。上記のインポート方法は適切な場所にインストールされます。とにかく私は反対票を投じるために賛成票を投じた。
GaryBishop 2014年

6
スクリプトの実行方法によっては、適切なpipを呼び出せません。
Natim、2016年

5
呼び出し[sys.executable, '-m', 'pip', 'install', name]は、ここで「正しい」ピップを取得することを確認しています。
WIM

12

@Aaronの回答に例外処理を追加しました。

import subprocess
import sys

try:
    import pandas as pd
except ImportError:
    subprocess.check_call([sys.executable, "-m", "pip", "install", 'pandas'])
finally:
    import pandas as pd

1
サブプロセスとピップの素晴らしい実装、ここでのほとんどのソリューションより優れています
Shantanu Shady

3
retunrの値をチェックしていないsubprocess.callため、コードが失敗する可能性があります。
Antti Haapala

5

「install_requires」オプションを使用して、独自のパッケージのsetup.py内に依存モジュールを定義します。

パッケージでコンソールスクリプトを生成する必要がある場合は、「console_scripts」エントリポイントを使用して、(たとえば、virtualenv環境の)「bin」フォルダ内に配置されるラッパースクリプトを生成できます。


1
これが正解であり、Pythonプロジェクトの依存関係を管理する唯一の賢明な方法です。virtualenv、Fabric、buildoutで動作します。@xiaomaoによって記述された方法は、OPが尋ねたものに正確に答えたとしても、純粋な狂気です。
Lukas Graf

7
これは適切なアドバイスですが、質問の答えにはなりません
Corey Goldberg

2
パッケージ化はトピックですが、Pythonで作成されたデプロイメントスクリプトなど、他にも多くの使用例があります。
17
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.