Я хотел сказать, что каталог, из которого выполняется python, этот каталог добавляется в pythonpath. Здесь во втором случае добавляется / dir, а не / dir / subdir2. Таким образом, вы можете либо изменить свой код, чтобы отразить изменения (одним из способов может быть добавление / dir / subdir2 к os.path в вашем коде), либо запустить python из соответствующей директории.
утался в том, как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
кварг указан? Затем я попытался датьenv
явно, сначала сделав копиюos.getenv
а во-вторых, просто даваяenv={'PATH': '/explicit/path/to/search/from'}
и до сих пор не находит исполняемый файл. Теперь я в тупике.
Надеюсь, пример поможет объяснить мою проблему более четко:
/ 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()
Если я в/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
.