2013-10-15 3 views
0

Были попытки получить что-то вроде этого, чтобы работать некоторое время, ниже, похоже, не отправляет правильный аргумент в c-файл arg_count, который выводит argc = 1. Когда я уверен, мне хотелось бы, чтобы это было 2. ./arg_count -arg из выходов оболочки 2 ...Подпроцесс python отсутствуют аргументы

Я попытался использовать другой аргумент (так что он будет выводить 3 в оболочке), и он все равно выдает 1 при вызове через подпроцесс.

import subprocess 
pipe = subprocess.Popen(["./args/Release/arg_count", "-arg"], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
out, err = pipe.communicate() 
result = out.decode() 
print "Result : ",result 
print "Error : ",err 

Любая идея, где я падаю? Я использую linux btw.

ответ

2

От documentation:

Оболочка аргумент (по умолчанию False) указывает, следует ли использовать оболочку как программы для выполнения. Если shell True, то рекомендуется передавать args как строку, а не как последовательность.

Таким образом,

pipe = subprocess.Popen("./args/Release/arg_count -arg", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

должен дать вам то, что вы хотите.

+0

Спасибо, это, кажется, решить проблему аргумент , но теперь я не получаю никакого вывода ... – jayjay

+0

по какой-либо причине сценарий должен находиться в том же каталоге, что и исполняемый файл, чтобы получить действительный результат? или я не знаю, как написать путь к файлу ... – jayjay

+0

Это не должно быть так; Я могу легко поместить свою версию 'arg_count' (в данном случае 2-строчный скрипт Python) в другой каталог и получить правильный результат. Если ваш 'arg_count' сам имеет какую-то неудобную проблему. – Evert

1

Если shell=True, то ваш вызов эквивалентен:

from subprocess import Popen, PIPE 

proc = Popen(['/bin/sh', '-c', "./args/Release/arg_count", "-arg"], 
      stdout=PIPE, stderr=PIPE) 

т.е. -arg передается самой оболочки, а не вашей программы. Отбросьте shell=True пройти -arg к программе:

proc = Popen(["./args/Release/arg_count", "-arg"], 
      stdout=PIPE, stderr=PIPE) 

Если вам не нужно, чтобы захватить stderr отдельно от stdout, то вы можете использовать check_output():

from subprocess import check_output, STDOUT 

output = check_output(["./args/Release/arg_count", "-arg"]) # or 
output_and_errors = check_output(["./args/Release/arg_count", "-arg"], 
           stderr=STDOUT) 
Смежные вопросы