私はピップを実行することに興味があります。そのようなウィンドウでコマンドシェルでpipを実行するたびに
c:\python27\script>pip install numpy
しかし、私はそれをpythonアイドル状態で実行できるかどうか疑問に思いました。
import pip
pip.install("numpy")
残念ながら、機能していません。
この質問は、pythonプログラムからpipを実行する方法に関するものです。IDLEは、このバージョンのクエシトンとは直接関係ありません。
J. J. Hakalaのコメントを拡張すると、_pip install pillow
_などのコマンドラインはスペースで分割されて_sys.argv
_になります。 pipがメインモジュールとして実行されると、pip.main(sys.argv[1:])
が呼び出されます。 pipをインポートする場合、pip.main(arg_line.split())
を呼び出すことができます。ここで、_arg_line
_は、コマンドラインのpip
の後ろの部分です。
昨年9月(2015)別のpythonプログラムからこの意図しないAPIを使用して実験し、トラッカーの問題の最初の結果 23551 を報告しました。議論とその後の結果が続きました。
1つのプロセスで複数のコマンドを実行する際の問題は、一部のpipコマンドが、通常一定のままであるsys.pathだけでなく、通常は変更されるインストール済みパッケージのリストもキャッシュすることです。 pipはプロセスごとに1つのコマンドを実行してから終了するように設計されているため、キャッシュを更新することはありません。 1つのプロセスで複数のコマンドを実行するためにpip.mainが使用される場合、キャッシング後に指定されたコマンドは、古くて正しくないキャッシュを使用する場合があります。たとえば、list
の後のinstall
は、 インストール前 の状態を示しています。
Pipからの出力を調べたいプログラムの2番目の問題は、stdoutとstderrに出力されることです。これらのストリームを実行中のpipの一部としてプログラム変数にキャプチャする program を投稿しました。
L_Pavによって提案されているように、各pipコマンドにサブプロセス呼び出しを使用すると、効率は低下しますが、両方の問題が解決されます。 communicate
メソッドは、出力ストリームを使用可能にします。サブプロセスのドキュメントを参照してください。
実際には、subprocess.Popen(apt-get numpy)
を使用できると思いますが、PIPでそれを行う方法はわかりません。
現時点では正式な方法はありません。pip.mainを使用できますが、現在のアイドルセッションでは、このインストールされたパッケージが「表示」されません。
pipの「高レベル」プログラムAPIを追加する方法 については多くの議論がありましたが、それは有望なようです。
Macを使用している場合は、次のように実行できるはずです。
これがお役に立てば幸いです。