4

私は Python ベースのシェル スクリプトを作成して、virtualenv、pip、および fabric を使用して Django アプリをボイラープレート化しています。簡単なはずですが、シェルスクリプトを介して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のより深い問題ですか?

ありがとう!

4

4 に答える 4

11

os.system を呼び出すたびに、元の python プロセスと同じプロパティを持つ新しいサブシェルでコマンドが実行されます。

コマンドをセミコロンで区切って 1 つの文字列にまとめてみてください。

于 2009-11-06T23:02:18.647 に答える
5

「source activate」をまったく使用しないでください。シェルの PATH を変更して、virtualenv の bin ディレクトリを最初に配置するだけです。あなたのスクリプトは、作成したばかりの virtualenv のディレクトリを知っていると思います。フルパスで _virtualenv_dir_/bin/easy_install を呼び出すだけです。または、virtualenv 内で他の python スクリプトを実行するための _virtualenv_dir_/bin/python 。

于 2009-11-09T03:32:02.580 に答える
4

呼び出しごとos.systemに新しいプロセスが作成されます。とが同じor呼び出しで実行されactivateていることを確認する必要があります。easy_installos.systemsubprocess

于 2009-11-06T23:01:22.893 に答える
3

virtualenvwrapper をインストールして、postmkvirtualenv フックを使用することもできます。これを使用して、pip と IPython の新しいコピーを作成した virtualenv に自動的に取り込みます (システム IPython を使用したくないため)。また、それを使用して pythonw を virtualenv にコピーします。そうしないと、wx ベースのものは機能しません。次のようになります。

easy_install pip
pip install -I ipython
cd ~/bin
python install_pythonw.py ${VIRTUAL_ENV}
于 2009-11-07T04:53:48.657 に答える