Domanda

Sto scrivendo uno script di shell Python-based per boilerplate un app Django con virtualenv, pip, e tessuto. Dovrebbe essere abbastanza semplice, ma sembra che io non sono in grado di attivare ed eseguire comandi nel virtualenv attraverso lo script di shell.

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

Quando si esegue, questo errori fuori:

$ 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

Ovviamente la linea source non è in esecuzione, ma perché? Si tratta di un problema di concorrenza / threading, o qualcosa di più profondo con virtualenv?

Grazie!

È stato utile?

Soluzione

Ogni chiamata os.system crea un nuovo processo. È necessario garantire che il activate e easy_install vengono eseguiti nella stessa chiamata os.system o subprocess.

Altri suggerimenti

Ogni chiamata a os.system esegue il comando in una nuova subshell, che ha le stesse proprietà del processo di pitone originale.

Prova a mettere i comandi in una stringa separata da virgole.

Basta non usare "fonte attivare" a tutti. E non fa altro che alterare il vostro PATH shell di mettere prima directory bin del virtualenv. Presumo che lo script conosce la directory del virtualenv che ha appena creato; tutto quello che dovete fare è chiamare _virtualenv_dir_ / bin / easy_install dal percorso completo. O _virtualenv_dir_ / bin / python per l'esecuzione di qualsiasi altro script python all'interno del virtualenv.

Si potrebbe anche installare virtualenvwrapper, e utilizzare il gancio postmkvirtualenv. Io lo uso per portare automaticamente le copie fresche di pip e IPython in virtualenvs che creo (come io non voglio che il mio sistema usando IPython). Io uso anche per copiare pythonw nella virtualenv, altrimenti roba WX-based non funzionerà. Sembra che questo:

easy_install pip
pip install -I ipython
cd ~/bin
python install_pythonw.py ${VIRTUAL_ENV}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top