2016-03-03 5 views
-1

когда я запускаю эту команду подпроцесс из питона, похоже, питона киосков и никогда не выводит ничего:Subprocess Python Ошибка

msg = subprocess.call(['/Users/admirmonteiro/bin/Praat', '/Users/admirmonteiro/tmp/tmp.praat']) 

, но когда я запускаю саму команду из терминала, он работает и закрывается, как должно :

Praat /tmp/tmp.praat 

ли кто-нибудь может сказать мне, почему питон не заканчивал код и буксует и ничего не выводит?

спасибо!

+0

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

+0

Нет, я не верю (вход в Praat - это tmp.praat), никакого вывода вообще нет, он фактически открывает инструмент praat и ожидает, что я запустим файл, и когда я сделаю вывод из подпроцесса команда. Я не хочу этого процесса. Я хочу, чтобы это было так, как будто я запускал его с терминала, который, когда я его называю, запускает Praat /tmp/tmp.praat и закрывается. – Aboogie

+0

Работает ли она в командной строке, если вы запускаете что-то вроде «cat/dev/null | Praat /tmp/tmp.praat | cat»? Удивление, если процесс Praat обнаруживает tty stdin/stdout и ведет себя по-другому из-за этого. –

ответ

0

Вы можете попробовать удостоверяясь STDIN и STDOUT (или другие дескрипторы) не вызывает проблему:

p = subprocess.POpen(
    ['/Users/admirmonteiro/bin/Praat', '/Users/admirmonteiro/tmp/tmp.praat'], 
    stdin=subprocess.PIPE, 
    stdout=subprocess.PIPE, 
    stderr=subprocess.STDOUT, 
    close_fds=True, 
) 
print p.communicate() 
print p.wait() 
+0

Я пробовал это, но он снова открывает Praat и ожидает, что я нажму кнопку запуска, а затем выйду из него, прежде чем python вернет что-нибудь. – Aboogie

-1

, кажется, вы обменялись аргументами.

msg = subprocess.call(['/Users/admirmonteiro/bin/Praat', '/Users/admirmonteiro/tmp/tmp.praat']) 

должен быть

msg = subprocess.call([ '/Users/admirmonteiro/tmp/tmp.praat','/Users/admirmonteiro/bin/Praat']) 
+0

нормально, нечетно, но когда я запускаю это: msg = subprocess.call (['/Users/admirmonteiro/tmp/tmp.praat','/Users/admirmonteiro/bin/Praat'],shell=True) Я получаю эту ошибку :/Пользователи/admirmonteiro/bin/Praat: /Users/admirmonteiro/tmp/tmp.praat: разрешение отклонено. – Aboogie

+0

совершенным. Теперь измените разрешение '/Users/admirmonteiro/tmp/tmp.praat быть исполняемым 'CHMOD + х'/Users/admirmonteiro/TMP/tmp.praat' если вы на * NIX платформе –

+0

Имейте новая ошибка: Traceback (самый последний вызов последнего): Файл "", строка 1, в Файл "/Users/admirmonteiro/anaconda/lib/python2.7/subprocess.py", строка 522, в колл- возврата Popen (* popenargs, ** kwargs) .wait() Файл «/Users/admirmonteiro/anaconda/lib/python2.7/subprocess.py», строка 710, в __init__ errread, errwrite) Файл «/ Пользователи/admirmonteiro/anaconda/lib/python2.7/subprocess.py ", строка 1335, в _execute_child raise child_exception OSError: [Errno 8] Ошибка формата Exec – Aboogie