2013-04-23 3 views
2

У меня есть wrapperexec, который должен вызвать exec и несколько аргументов.вызов сценария оболочки в подпроцессе

subprocess.check_call(["wrapperexec", "exec", "arg1"], shell=True, cwd="/dirA") 

Когда я звоню выше сценарий не проходит никаких аргументов в wrapperexec. Но когда я изменяю:

subprocess.check_call(["wrapperexec", "exec", "arg1"], shell=False, cwd="/dirA") 

это передать аргументы, как и ожидалось. Может кто-нибудь объяснить мне, почему первый не работает?

EDIT:

К сожалению, я был на полном ложном пути при создании этой проблемы. Обновлено сейчас до реальной проблемы.

+0

check_call вызовет исключение, если он не сможет найти скрипт или если скрипт возвращает ненулевое значение. Выход «end» предполагает, что ваша дочерняя программа успешно выполняет, но ничего не выводит. – monk

+0

@monk, это то, что заставило меня поверить, что это был поиск PATH, но на самом деле это вызов команды – abergmeier

ответ

1

Экологическая path является сложным понятием, есть «база» path разделяют все, но вы также можете временно изменить или добавить в path в конкретных процессах. Это означает, что если вы изменяете path в своем скрипте, но затем вызываете subprocess, то subprocess не будет иметь того же path, что и родительский скрипт.

Если вы не выполните следующие действия:

subprocess.check_call(["nonsystemexec"], shell=True, cwd="/dirA", env=os.environ) 

Здесь вы сообщаете subprocess использовать текущий окр, который будет включать в себя текущую path.


Примечание: Если вы хотите, чтобы иметь subprocess использовать модифицированную окр, но не такой же один у вас есть. Вы можете сделать что-то вроде этого:

env = os.environ.copy() 
env['PATH'] += ';/dirB' 
subprocess.check_call(["nonsystemexec"], shell=True, cwd="/dirA", env=env) 
+0

Это, кажется, противоречит _If env не None, это должно быть сопоставление, определяющее переменные среды для нового процесса; они используются вместо наследования текущей среды процесса, которая является поведением по умолчанию. В документах. – abergmeier

+0

@LCIDFire Возможно, это может показаться * для этого, но если вы попробуете, он будет работать. –

+0

И передача 'env' для каждого check_call не имеет никакого значения. – abergmeier

Смежные вопросы