Frage

Ich schreibe eine Python-basierte Shell-Skript einen Django-app mit virtualenv, pip und Geweben vorformulierten. Sollte einfach sein genug, aber es scheint, dass ich nicht in der Lage bin Befehle in der virtualenv durch den Shell-Skript aktivieren und ausführen.

os.system('virtualenv %s --no-site-packages' % project_name)
os.system('source %s/bin/activate' % project_name)
os.system('easy_install pip')

Beim Laufen, diese Fehler aus:

$ 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

Offensichtlich ist die source Linie wird nicht laufen, aber warum? Ist es eine Gleichzeitigkeit / Threading-Problem oder etwas tiefer mit virtualenv?

Danke!

War es hilfreich?

Lösung

Jeder os.system Aufruf erzeugt einen neuen Prozess. Sie werden sicherstellen müssen, dass die activate und die easy_install in dem gleichen os.system oder subprocess Anruf ausgeführt werden.

Andere Tipps

Jeder Aufruf von os.system führt den Befehl in einem neuen Sub-Shell, die die gleichen Eigenschaften wie der ursprünglichen Python-Prozess hat.

Versuchen Sie die Befehle in eine Zeichenfolge von Semikolon getrennt setzen.

Verwenden Sie einfach nicht „Quelle aktivieren“ überhaupt. Es tut nichts anderes als Ihre Shell PATH ändern zuerst die virtualenv der bin-Verzeichnis zu setzen. Ich nehme an das Skript das Verzeichnis des virtualenv weiß, dass es gerade erstellt hat; alles, was Sie tun müssen, ist Aufruf _virtualenv_dir_ / bin / easy_install durch vollständigen Pfad. Oder _virtualenv_dir_ / ist / python innerhalb der virtualenv anderen Python-Skript ausgeführt wird.

Sie können auch installieren virtualenvwrapper, und verwenden Sie den postmkvirtualenv Haken. Ich benutze es automatisch in neuen Kopien von pip zu bringen und IPython in virtualenvs schaffe ich (wie ich will es nicht mein System IPython verwenden). Ich benutze es auch pythonw in die virtualenv, sonst wx-basierte Sachen arbeiten nicht zu kopieren. Sieht wie folgt aus:

easy_install pip
pip install -I ipython
cd ~/bin
python install_pythonw.py ${VIRTUAL_ENV}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top