Назад | Перейти на главную страницу

/ bin / sh - неинтерактивное использование из Python

Я вызываю 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