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

1

Я вызываю cmd из Python следующим образом:

subpocess.Popen(['coffee'], shell=True)

который я верю, переведен на:

/bin/sh -c "coffee"

Из документов, которые я прочитал, в файлах интерактивного режима non-, таких как /etc/profile,/etc/bash.bashrc не читаются и используется по умолчанию $PATH (init $PATH). Я прав? Есть ли единственный способ добавить кофе в $PATH, чтобы скопировать его в/usr/local/bin?

Теги:

2 ответа

2
Лучший ответ

Нет, оболочка наследует PATH от интерпретатора Python, т.е. будет os.getenv('PATH'). Кроме того, вы можете установить путь в команде:

subprocess.Popen(['PATH=/where/ever/bin:$PATH coffee'], shell=True)

хотя я бы посоветовал вам либо использовать полный путь к coffee, либо установить PATH перед выполнением вашей программы Python.

  • 1
    Лучший способ установить переменные окружения для команды - использовать аргумент env для subprocess.Popen . Это работает, даже если вы не задействуете оболочку (что, в конце концов, обычно плохая идея).
  • 0
    @Thomas: да, env был бы еще лучше, и, возможно, OP не должен использовать shell=True .
Показать ещё 1 комментарий
2

Исторически ни один из файлов запуска не читается для оболочек, вызываемых как non- интерактивные команды, так как предположительно среда уже настроена.

Python, shells, и фактически почти все передают существующую среду или, по крайней мере, переменную среды PATH через дочернюю оболочку, и поэтому в некотором смысле вы уже выполнили .profile или bash расширение. (Поскольку он запускался, когда пользователь вошел в систему и другие процессы унаследовал модифицированный PATH.)

Параметры, которые у вас есть:

  • укажите путь для всех пользователей системы в /etc/profile
  • требуют от пользователя соответствующих настроек PATH (вы их наследуете)
  • запустить подпроцессы с полными путями
  • поместите все команды в каталоги уже на PATH
  • 0
    Благодаря / upvoted. Принимается ответ Ларсмана, потому что у него меньше репутации :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню