subprocess.Popen: mkvirtualenv no encontrado

Estoy usando virtualenvwrapper en mi despliegue. Para configurar nuevos entornos, estoy ejecutando un script de Python, que contiene todos los pasos necesarios.

El script de instalación incluye:

cmd = 'mkvirtualenv %s --no-site-packages'%('testname') head = subprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) for line in head.stdout.read().splitlines(): print line 

La salida es:

 /bin/sh: mkvirtualenv: not found 

¿Cómo puedo usar correctamente virtualenvwrapper dentro de mi script de python?

EDITAR:

El siguiente código funciona para mí:

 cmd = 'source /usr/local/bin/virtualenvwrapper.sh && mkvirtualenv %s --no-site-packages'%('testname') head = subprocess.Popen(cmd, executable='bash', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) for line in head.stdout.read().splitlines(): print line 

Gracias por todas las respuestas.

mkvirtualenv puede ser una función de shell que se agrega a su entorno mediante la obtención de un script virtualenvwrapper.sh desde el archivo de inicio de su shell . El comando predeterminado invocado en shell=True (por ejemplo, /bin/sh -c ... ) podría no leerlo.

Podrías fuente el archivo explícitamente:

 import pipes from subprocess import check_call check_call("""source /path/to/virtualenvwrapper.sh && mkvirtualenv --no-site-packages """ + pipes.quote(envname), executable='bash', shell=True) 

Editar:

Aprendí que mkvirtualenv es una función de shell. En este caso, la pregunta es how to run shell function in python . Mi respuesta a continuación puede aplicarse a binarios independientes. Para su pregunta, mire la respuesta: https://stackoverflow.com/a/5826523/1906700 Puede llamar indirectamente a la función mkvirtualenv () desde el script que la define.

Establecer la variable PATH correctamente

El problema parece ser causado por su variable $PATH . mkvirtualenv establecer correctamente esta variable para que se pueda encontrar el ejecutable mkvirtualenv . Por ejemplo, si tiene el ejecutable mkvirtualenv en `/ home / thore / scripts, necesita configurar su $ PATH en .bashrc o .zshrc (dependiendo de su shell) de la siguiente manera:

  export PATH=$PATH:/home/thore/scripts 

De esa manera, el script mkvirtualenv se encontrará correctamente y se ejecutará.

Otra solución

La otra solución al problema sería utilizar la ruta exacta para el script en cuestión. En ese caso, puede /home/thore/scripts/mkvirtualenv como parámetro a subproceso.