Activar virtualenv através os.system ()
-
18-09-2019 - |
Pergunta
Eu estou escrevendo um script shell baseado em Python para clichê um aplicativo Django com virtualenv, pip, e tecido. Deve ser suficiente simples, mas parece que eu não sou capaz de ativar e executar comandos no virtualenv através do shell script.
os.system('virtualenv %s --no-site-packages' % project_name)
os.system('source %s/bin/activate' % project_name)
os.system('easy_install pip')
Ao executar, este erros fora:
$ 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
Obviamente, a linha source
não está sendo executado, mas por quê? É uma concorrência / problema de segmentação, ou algo mais profundo com virtualenv?
Obrigado!
Solução
Cada chamada os.system
cria um novo processo. Você vai precisar para assegurar que o activate
eo easy_install
são executados na mesma chamada os.system
ou subprocess
.
Outras dicas
Cada chamada para os.system executa o comando em uma nova subshell, que tem as mesmas propriedades que o processo de python originais.
Tente colocar os comandos em uma string separada por ponto e vírgula.
Só não use "ativar a fonte" em tudo. Ele não faz nada, mas alterar o seu shell PATH para colocar o diretório bin do virtualenv em primeiro lugar. Eu presumo que o seu script sabe o diretório do virtualenv que acaba de criar; tudo que você tem a fazer é chamar _virtualenv_dir_ / bin / easy_install pelo caminho completo. Ou _virtualenv_dir_ / bin / python para a execução de qualquer outro script python dentro do virtualenv.
Você também pode instalar virtualenvwrapper, e usar o gancho postmkvirtualenv. Eu usá-lo para trazer automaticamente em cópias novas de pip e IPython em virtualenvs eu crio (como eu não quero isso usando meu sistema IPython). Eu também usá-lo para copiar pythonw para o virtualenv, coisas com base wx-caso contrário não vai funcionar. Looks como este:
easy_install pip
pip install -I ipython
cd ~/bin
python install_pythonw.py ${VIRTUAL_ENV}