os.system経由virtualenvのアクティブ化()
-
18-09-2019 - |
質問
私はvirtualenvの、ピップ、およびファブリックでDjangoのアプリを定型するPythonベースのシェルスクリプトを書いています。十分に簡単であるが、私はシェルスクリプトを通じてvirtualenvの中のコマンドをアクティブにし、実行することはできないんだと思わなければならない。
os.system('virtualenv %s --no-site-packages' % project_name)
os.system('source %s/bin/activate' % project_name)
os.system('easy_install pip')
実行している場合、このエラーが出ます:
$ startproject+ -s false sample
New python executable in sample/bin/python
Installing setuptools............done.
/testing
Searching for pip
Best match: pip 0.4
Processing pip-0.4-py2.6.egg
pip 0.4 is already the active version in easy-install.pth
Installing pip script to /usr/local/bin
error: /usr/local/bin/pip: Permission denied
もちろんsource
ラインは、実行されているが、なぜされていませんか?それは同時実行/スレッド化の問題、またはvirtualenvのとのより深い何かですか?
ありがとうございます。
解決
各os.system
コールは、新しいプロセスを作成します。あなたがactivate
とeasy_install
が同じos.system
またはsubprocess
の呼び出しで実行されていることを確認する必要があります。
他のヒント
os.systemを呼び出すたびに、元のPythonのプロセスと同様の特性を有する新しいサブシェルでコマンドを実行します。
セミコロンで区切られた1つの文字列にコマンドを入れてみてください。
ただ、全く「アクティブソース」を使用しないでください。それは何もしませんが、最初にvirtualenvのbinディレクトリを置くために、あなたのシェルのPATHを変更します。私はあなたのスクリプトは、それだけで作成したvirtualenvののディレクトリを知っていると推定します。あなたがしなければならないのは、完全なパスで呼び出し_virtualenv_dir_ / binに/ easy_installをです。 virtualenvの内の任意の他のPythonスクリプトを実行するための_virtualenv_dir_ / binに/ Pythonやます。
またvirtualenvwrapperインストール、およびpostmkvirtualenvフックを使用することができます。私は自動的に私は(私はそれが私のシステムIPythonを使用したくないとして)を作成virtualenvsにピップとIPythonの新鮮なコピーをもたらすためにそれを使用します。私はまた、そうでない場合はWX-ベースのものが動作しません、virtualenvのにpythonwをコピーするためにそれを使用します。このようになります。
easy_install pip
pip install -I ipython
cd ~/bin
python install_pythonw.py ${VIRTUAL_ENV}