Я вызываю cmd из Python следующим образом:
subpocess.Popen(['coffee'], shell=True)
который, как я полагаю, переведен на:
/bin/sh -c "coffee"
Из документов я прочитал, что в неинтерактивном режиме файлы, такие как / etc / profile, /etc/bash.bashrc не читаются и используется по умолчанию $ PATH (init $ PATH). Я в порядке? Есть ли единственный способ добавить кофе в $ PATH - скопировать его в / usr / local / bin?
Вы можете изменить PATH
переменная окружения в вашем скрипте Python перед запуском оболочки, то есть какой-то вариант:
import os
os.environ['PATH'] = '/some/new/path:%s' % os.environ['PATH']
subpocess.Popen(['coffee'], shell=True)
Обратите внимание, что настройка shell=True
очень часто не требуется, и вы должны знать о последствиях этого, особенно если вы звоните Popen
используя данные, предоставленные пользователем. Общая проблема заключается в том, что данные, содержащие метасимволы оболочки (например, «>» или «;», «&») и т. Д., Могут вызвать неожиданное поведение.
ОБНОВИТЬ: Например, если у меня есть сценарий с именем /tmp/foo
и я хочу запустить это, используя subprocess.Popen
, это прекрасно работает:
>>> import os, subprocess
>>> os.environ['PATH'] = '/tmp:%s' % os.environ['PATH']
>>> subprocess.Popen('foo', shell=False)
Если я не установлю PATH
, то я получаю ожидаемую ошибку:
OSError: [Errno 2] No such file or directory