Estoy confundido acerca de cómo subprocess
busca el ejecutable cuando usa Popen()
. Funciona si se le dan rutas absolutas al proceso secundario, pero estoy tratando de usar rutas relativas. He encontrado que si configuro la variable de entorno PYTHONPATH, entonces puedo obtener módulos importados de esa ruta, y PYTHONPATH está ahí en sys.path
, pero no parece ayudar con el comportamiento de subprocess.Popen
. También he intentado editar el archivo PYTHONPATH añadiendo sitecustomize.py
a os.environ
, al igual quepython subprocess Popen environment PATH?
# copy PYTHONPATH environment variable into PATH to allow our stuff to use
# relative paths for subprocess spawning
import os
if os.getenv('PYTHONPATH') is not None and os.getenv('PATH') is not none:
os.environ['PATH'] = ':'.join([os.getenv('PATH'), os.getenv('PYTHONPATH')])
y verificó que al poner en marcha pitón, de forma interactiva, con ipython, o ejecutando un script desde la línea de comandos, que es PYTHONPATH aparece con éxito en os.environ
. Sin embargo, subrocess.Popen
todavía no busca allí el ejecutable. Pensé que se suponía que debía heredar el entorno de los padres, si no se especifica env
kwarg? Luego traté de dar env
explícitamente, primero haciendo una copia de os.getenv
y en segundo lugar simplemente dando env={'PATH': '/explicit/path/to/search/from'}
, y todavía no encuentra el ejecutable. Ahora estoy perplejo.
suerte Un ejemplo ayudará a explicar mi problema con mayor claridad:
/dir/subdir1/some_executable
/dir/subdir2/some_script.py
# some_script.py
from subprocess import Popen, PIPE
spam, eggs = Popen(['../subdir1/some_executable'], stdout=PIPE, stderr=PIPE).communicate()
Si estoy en /dir/subdir2
y yo ejecutar python some_script.py
funciona, pero si estoy en /dir
y ejecuto python subdir2/some_script.py
aunque /dir/subdir2
se encuentre en el , entonces el subproceso arrojará OSError: [Errno 2] No such file or directory
.
Al volver a leer la pregunta, creo que veo el problema. En un shell de comandos, cambie a '/ dir' y vea qué sucede si escribe' ../ subdir1/some_executable'. – ncoghlan
ok veo lo que estás diciendo, mi malentendido fue la suposición de que las rutas relativas serían buscadas de la misma manera que una llamada a un programa simple. gracias – wim