Я смущен тем, как 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.