2015-02-24 3 views
1

Я пытаюсь сгенерировать несколько файлов параллельно с помощью python. Python вызывает команду генерации как новый подпроцесс. Пока что так хорошо, подпроцессы создаются, как и файлы.Возврат из вызовов подпроцесса

Что я заметил, в конце последнего процесса ожидается возврат каретки. Нажав enter, он завершает последний процесс.

Если я запускаю генерацию файла синхронно (то есть последовательно) с помощью os.system (commandString), CR не требуется. Последний процесс каким-то образом ждет чего-то?

Благодарим за помощь!

Михай

import subprocess 
for trace in traces: 
    ... # build commandString containing the in- and output filename 
    from subprocess import Popen 
    p = Popen(commandString) 
+1

'check_call' будет ждать и убедиться, что вы получили статус 0 –

ответ

0

Я предполагаю, что я забыл ждать процессов до конца?

Я изменил код, работает сейчас! :

processList = [] 
for trace in traces: 
... # build commandString containing the in- and output filename 
    from subprocess import Popen 
    p = Popen(commandString) 
    processList.append(p) 

for pr in processList: 
    pr.wait() 
+1

Действительно, вы забыли подождать. Если это работает, это означает, что ваш подпроцесс не ожидает ввода через stdin. В этом случае вы можете воспользоваться ярлыком с помощью одного из вспомогательных методов, таких как 'call()', без указания каких-либо аргументов stdout/err/in. Однако таким образом вы теряете мелкозернистый контроль над вашим подпроцессом. См. Мой ответ. –

0

Прежде всего, только вы знаете, что эти подпроцессы и есть ли они в какой-то момент ожидают ввода отправляется через stdin или нет. Если они это сделают, вы можете отправить .

Тогда есть an important note in the Python docs для замены os.system():

status = subprocess.call("mycmd" + " myarg", shell=True) 

Таким образом, нет никакой необходимости идти Popen() маршрут, есть полезные вспомогательные методы в модуле подпроцесса, такие как call(). Однако , если вы используете Popen(), вам необходимо позаботиться о возвращенном объекте впоследствии.

Для лучшего контроля в вашем случае я бы использовал sp = subprocess.Popen(...) в сочетании с out, err = sp.communicate(b"\n").

Обратите внимание, что sp.communicate(b"\n") явно отправляет символ новой строки подпроцессу через stdin.

+0

спасибо за совет Ян-Филип. Действительно, эти подпроцессы не ожидают CR, потому что они работают, как ожидалось, при вызове их с os.system(). Я добавил комментарий к своему оригинальному сообщению. Мне нужно было вызвать pid.wait(), теперь он работает. Благодаря! –

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