Я вызываю cmd из Python следующим образом:
subpocess.Popen(['coffee'], shell=True)
который я верю, переведен на:
/bin/sh -c "coffee"
Из документов, которые я прочитал, в файлах интерактивного режима non-, таких как /etc/profile,/etc/bash.bashrc не читаются и используется по умолчанию $PATH (init $PATH). Я прав? Есть ли единственный способ добавить кофе в $PATH, чтобы скопировать его в/usr/local/bin?
Нет, оболочка наследует PATH
от интерпретатора Python, т.е. будет os.getenv('PATH')
. Кроме того, вы можете установить путь в команде:
subprocess.Popen(['PATH=/where/ever/bin:$PATH coffee'], shell=True)
хотя я бы посоветовал вам либо использовать полный путь к coffee
, либо установить PATH
перед выполнением вашей программы Python.
Исторически ни один из файлов запуска не читается для оболочек, вызываемых как non- интерактивные команды, так как предположительно среда уже настроена.
Python, shells, и фактически почти все передают существующую среду или, по крайней мере, переменную среды PATH
через дочернюю оболочку, и поэтому в некотором смысле вы уже выполнили .profile
или bash расширение. (Поскольку он запускался, когда пользователь вошел в систему и другие процессы унаследовал модифицированный PATH.)
Параметры, которые у вас есть:
/etc/profile
env
дляsubprocess.Popen
. Это работает, даже если вы не задействуете оболочку (что, в конце концов, обычно плохая идея).env
был бы еще лучше, и, возможно, OP не должен использоватьshell=True
.