Я смущен тем, как 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, либо путем запуска script из командной строки, что PYTHONPATH успешно появляется в os.environ
. Однако subrocess.Popen
по-прежнему не выполняет поиск для исполняемого файла. Я думал, что он должен наследовать родительскую среду, если не указано env
kwarg? Затем я попытался дать env
явно, сначала сделав копию os.getenv
, а во-вторых, просто нажав env={'PATH': '/explicit/path/to/search/from'}
, и он все еще не находит исполняемый файл. Теперь я в тупике.
Надеюсь, что пример поможет более четко объяснить мою проблему:
/реж/subdir1/some_executable
/dir/subdir 2/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
.