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!

Foi útil?

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}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top