2016-04-14 2 views
1

Я пытаюсь научиться писать сценарий control.py, который запускает другой скрипт test.py в цикле для определенного количества раз в каждом прогоне, считывает его вывод и останавливает его, если некоторые предопределенные вывод печатается (например, текст «останавливается сейчас»), и цикл продолжает свою итерацию (как только test.py закончил, либо самостоятельно, либо силой). Так что-то вдоль линий:Управление скриптом python из другого сценария

for i in range(n): 
    os.system('test.py someargument') 
    if output == 'stop now': #stop the current test.py process and continue with next iteration 
    #output here is supposed to contain what test.py prints 
  • Проблема с выше является то, что он не проверяет выход test.py, как он работает, а не ждет, пока test.py процесс закончен сам по себе, не так ли?
  • В основном пытается узнать, как я могу использовать скрипт python для управления другим, как он работает. (например, доступ к тому, что он печатает и т. д.).
  • И, наконец, можно ли запустить test.py в новый терминал (т. Е. Не в терминале control.py) и все еще достичь вышеуказанных целей?

Попытка: test.py это:

from itertools import permutations 
import random as random 


perms = [''.join(p) for p in permutations('stop')] 

for i in range(1000000): 
    rand_ind = random.randrange(0,len(perms)) 
    print perms[rand_ind] 

И control.py это: (по предложению Марка,)

import subprocess 

command = ["python", "test.py"] 
n = 10 
for i in range(n): 
    p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
    while True: 
     output = p.stdout.readline().strip() 
     print output 
     #if output == '' and p.poll() is not None: 
     # break 
     if output == 'stop': 
      print 'sucess' 
      p.kill() 
      break 
      #Do whatever you want 
    #rc = p.poll() #Exit Code 
+0

'os.system' устарел; вы должны использовать модуль 'subprocess' – jmetz

+0

для запуска test.py в новом терминале, вам необходимо запустить этот процесс, например. 'subprocess.call ([" xterm "," -e "," python "," test.py "," someargument "])' – jmetz

+0

Возможно, вас заинтересует [pexpect] (https://pypi.python.org/PyPI/pexpect /). – zondo

ответ

1

То, что вы намекаете на вашем комментарий к ответу Marc Кабос является Threading

Есть несколько способов Python может использовать функциональность других файлов. Если содержимое test.py может быть инкапсулировано в функцию или класс, то вы можете import соответствующих частей в свою программу, что дает вам больший доступ к выполнению этого кода.

Как описано в других ответах, вы можете использовать стандартный сценарий, запускающий его в подпроцессе. Это может привести к выходу отдельных выходов терминала по мере необходимости.

Однако, если вы хотите запустить test.pyодновременно и получить доступ к переменным по мере их изменения, тогда вам необходимо рассмотреть вопрос о потоке.

+1

oh wow Я так много учусь. Действительно, в этом конкретном примере я только пытаюсь получить доступ к выводам печати 'test.py' здесь. –

+0

Я добавил неудачную попытку на свой пост, если вы хотите посмотреть –

+0

Просто имейте. Получил это, чтобы работать на моей машине, но я запускаю py3 в эти дни ... – dodell

0

Вы можете использовать "подпроцесс" библиотека для этого.

import subprocess 

command = ["python", "test.py", "someargument"] 

for i in range(n): 
    p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
    while True: 
     output = p.stdout.readline() 
     if output == '' and p.poll() is not None: 
      break 
     if output == 'stop now': 
      #Do whatever you want 
    rc = p.poll() #Exit Code 
+0

Привет, спасибо за предложение. Если я не ошибаюсь, с этим, ответ, ошибка заполняется только после того, как p закончен, правильно? Я вроде хочу прочитать распечатки подпроцесса, когда он запущен, а затем остановить этот подпроцесс, если среди отпечатков напечатано «stop now». Это достижимо? –

+0

Тест, если он работает правильно ... Я не могу проверить это сейчас (только что закодировано). –

+0

Большое спасибо, сейчас попробуем. Наверное, вы хотели написать «перерыв» после второго условия, верно? –

0

Да, вы можете использовать Python для управления другой программы с помощью STDIN/STDOUT, но при использовании другого выхода процесса часто возникает проблема буферизации, другими словами, другой процесс, на самом деле не выводить ничего, пока это сделано ,

Есть даже случаи, когда вывод буферизуется или не зависит от того, запущена ли программа с терминала или нет.

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

+0

oh: ((обман ... вы видите путь вокруг этого? (потому что мне только заботится о том, что 'test.py' печатает и не то, что он делает, поэтому я подумал, что если я запустил его в другом терминале, то, возможно, у меня есть шанс прочитать сам терминал, чтобы узнать, что такое «тест».py' is printing) –

2

Вы можете использовать модуль подпроцесс или также os.popen

os.popen(command[, mode[, bufsize]]) 

Открыть трубку или из команды. Возвращаемое значение представляет собой объект открытого файла, подключенный к каналу, который может быть прочитан или записан в зависимости от того, является ли режим «r» (по умолчанию) или «w».

С подпроцессом Я хотел бы предложить

subprocess.call(['python.exe', command]) 

или subprocess.Popen ->, который похож на os.popen (например)

С POPEN вы можете прочитать связный объект/файл и проверьте, есть ли «Стоп сейчас».

Система os.system не устарела, и вы также можете использовать ее (но вы не получите объект от этого), вы можете просто проверить, вернется ли возврат в конце выполнения.

От subprocess.call вы можете запустить его в новом терминале или если вы хотите вызывать несколько раз ТОЛЬКО test.py ->, чем вы можете поместить свой скрипт в def main() и запустить главное как вы хотите, пока не появится «Stop now».

Надеюсь, что это разрешит ваш запрос :-) иначе комментарий еще раз.

Глядя на то, что вы написали выше, вы также можете перенаправить вывод в файл непосредственно из вызова ОС -> os.system (test.py * args >> /tmp/mickey.txt), то вы можете проверить на каждый раунд файла.

Как сказано, popen - это объектный файл, к которому вы можете получить доступ.

+0

Спасибо Марко, я попробую простой скрипт и попробую эту идею, я вернусь к вам –

+0

Точно, что вы ищете, это темы. Это то, что вам нужно в конце :-) То, что я предложил выше, немного проще, но потоки - правильный ответ, я думаю :-) Имейте приятный день. –

+0

Я добавил первую попытку на свой пост. он может сделать некоторые из вещей, которые я хотел. Остается назвать подпроцесс в новом терминале (на ubuntu), какие-нибудь идеи? –

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