2016-06-25 3 views
-2

Тип простого вопроса, но я ничего не могу найти рядом с моей проблемой, поэтому здесь я иду, я пытаюсь выполнить программу на языке C на Python, чтобы получить результат, проблема в этом не работает. У меня нет ошибки, но когда я пытаюсь распечатать вывод, я просто ничего не получаю, как пустое пространство или что-то в этом роде, но если я печатаю то, что выводится (это слово?) В моем C, он работает отлично, так вот мой питон код:Получение вывода программы C в python

command = "./serialize %s %s %s" %(binary , width , height) 
p=subprocess.Popen(command, shell=True,stderr=subprocess.STDOUT) 
(output, err) = p.communicate() 
print output 

(довольно прямо вперед, двоичная строка и ширина и высота являются целые числа)

и если вы хотите знать, вот мой C код:

char* main(char* argc,char* argv[]){ 
char* r; 
r = serialize(argv[1],atoi(argv[2]),atoi(argv[3])); 
printf("%s", r); 
return r; 
} 

(сериализация - это функция, которую я сделал, которая отлично работает, я знаю, из-за pr intf перед возвратом, которые дают мне то, что я хочу).

Итак, если у вас есть идея, что было бы здорово, спасибо всем.

ответ

-1

Два вопроса здесь:

  • Popen занимает список аргументов, а не строка. Передача этого, когда shell=True является плохой угрозой безопасности. Представьте, если width равно ; rm -rf /.
  • Возвращаемое значение - это специальный объект, содержащий информацию о запуске . Popen не ждет возврата процесса.

Try:

command = ['./serialize', binary, str(width), str(height)] 
stdout, stderr = subprocess.check_output(command) 
print stdout, stderr 

Если вы хотите, как стандартный вывод и стандартный поток ошибок в одной строке, сделайте следующее:

output = subprocess.check_output(command, stderr=subprocess.STDOUT) 

Ваш код C также неправильно. main должен вернуть int с кодом возврата процесса (0 в этом случае), и вы можете использовать puts(r) вместо printf. Он также будет сильно сбой, если вы пройдете менее 3 аргументов. Кроме того, argc также является int. Попробуйте что-то вроде:

int main(int argc, char** argv) { 
    char* r; 
    if (argc < 4) { 
     puts("Too few arguments"); 
     return 1; 
    } 
    r = serialize(argv[1],atoi(argv[2]),atoi(argv[3])); 
    puts(r); 
    return 0; 
} 
+0

Только что попробовал это, но я получил сообщение об ошибке, здесь отслеживающий: Traceback (самый последний вызов последний): Файл "testsql.py", строка 77, в стандартный вывод, STDERR = subprocess.check_output (команда) Файл «/usr/lib/python2.7/subprocess.py», строка 567, в файле check_output process = Popen (stdout = PIPE, * popenargs, ** kwargs) Файл «/ usr /lib/python2.7/subprocess.py ", строка 711, в __init__ errread, errwrite) Файл" /usr/lib/python2.7/subprocess.py ", строка 1340, в _execute_child raise child_exception TypeError: execv() arg 2 должен содержать только строки –

+0

@DrunkenChoko Значения 'width' и' height'? Я так считаю; Я обновил ответ. – refi64

+0

Argh, ну, новый день, новая ошибка, возвращенный ненулевой статус выхода 32, это довольно уродливо, я бы сказал. –

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