Я не совсем понимаю, как subprocess
ищет исполняемый файл при использовании Popen()
. Это работает, если заданы абсолютные пути к дочернему процессу, но я пытаюсь использовать относительные пути. Я обнаружил, что если я установлю переменную окружения PYTHONPATH, тогда я смогу получить импортированные модули по этому пути, и PYTHONPATH будет в sys.path
, но это, похоже, не помогает с поведением subprocess.Popen
. Я также попытался отредактировать файл sitecustomize.py
, добавив PYTHONPATH в os.environ
, например,
# 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')])
и проверил, что при запуске python, в интерактивном режиме, с ipython или при запуске сценария из командной строки, PYTHONPATH успешно появляется в os.environ
. Однако subrocess.Popen
все еще не ищет там исполняемый файл. Я думал, что он должен был наследовать родительскую среду, если не указан env
kwarg? Затем я попытался явно указать env
, сначала сделав копию os.getenv
, а затем просто указав env={'PATH': '/explicit/path/to/search/from'}
, и он все еще не находит исполняемый файл. Теперь я в тупике.
Надеюсь, пример поможет объяснить мою проблему более четко:
/ реж / 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()
Если я в /dir/subdir2
и я запускаю python some_script.py
, это работает, но если я в /dir
и я запускаю python subdir2/some_script.py
, хотя /dir/subdir2
в os.environ['PATH']
, тогда подпроцесс будет бросить OSError: [Errno 2] No such file or directory
.