subprocess.Popen
позволяет вам поставлять словарь переменных окружения, который станет средой для выполняемого процесса. Если единственная причина, по которой вам нужен shell=True
, - установить переменную окружения, тогда я предлагаю вместо этого использовать явный словарь среды; это безопаснее и не особенно сложно. Кроме того, обычно проще создавать вызовы команд, когда вам не нужно беспокоиться о метасимволах и метасимволах оболочки.
Возможно, даже не нужно создавать словарь среды, если вы не возражаете против наличия переменных окружения, установленных в запущенном процессе. (В большинстве случаев это не проблема, но иногда это так. Я не знаю достаточно о вашем заявлении, чтобы рассказать.)
Если вы можете изменить свою собственную среду с настройками, просто сделайте это :
os.environ['theEnvVar'] = '/the/value'
Тогда вы можете просто использовать простой Popen.call
(или аналогичный), чтобы запустить команду:
output = subprocess.check_output(["ls", "-lR", "/tmp"])
Если по каким-либо причинам вы не можете изменить свое собственное окружение, вам нужно сделать копию текущую среду, изменить ее по желанию и передать ее каждому subprocess.call
:
env = os.environ.copy()
env['theEnvVar'] = '/the/value'
output = subprocess.check_output(["ls", "-lR", "/tmp"], env=env)
Если вы не хотите, чтобы указать env=env
каждый раз, просто написать небольшой класс-обертку.
Каждая выполняемая вами команда все еще является подпроцессом и дочерним процессом либо вашего скрипта, либо оболочки, которая была порождена вашим скриптом. Вам нужна оболочка между вашим ребенком и вашим скриптом? – soulseekah
В каждом подпроцессе.Popen мне нужно экспортировать переменную и запустить команду cmd в том же вызове. Это приведет к уродливому синтаксису. Было бы здорово экспортировать эту переменную только один раз и после этого запустить мои команды cmd. –
Если вам не нужно использовать 'subprocess.Popen()', вы должны использовать 'multiprocessing.Process'. (Все ли ваши вакансии независимы и ненасильны?Вам нужно беспокоиться о том, чтобы перехватить ненулевой статус ошибки в середине вашей последовательности заданий?) – smci