我正在尝试学习如何编写脚本control.py
,它在循环中运行另一个脚本test.py
一定次数,在每次运行中,读取其输出并暂停它,如果有的话打印预定义输出(例如文本'现在停止'),循环继续其迭代(一旦test.py
完成,可以单独或通过强制)。所以有一些事情:
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
进程自行完成,对吧?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
就是这样:(遵循Marc的建议)
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 :(得分: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()中,然后根据需要运行main,直到现在停止"是生成的。
希望这可以解决您的疑问:-)否则再次发表评论。
看看你上面写的内容,你也可以直接从OS调用中将输出重定向到一个文件 - > os.system(test.py * args>> /tmp/mickey.txt)然后你可以检查每一轮的文件。
如上所述,popen是一个可以访问的目标文件。
答案 1 :(得分:1)
你在对Marc Cabos的回答中所暗示的是Threading
Python可以通过多种方式使用其他文件的功能。如果import
的内容可以封装在一个函数或类中,那么您可以将test.py
相关部分放入您的程序中,从而更好地访问该代码的运行。
如其他答案中所述,您可以使用脚本的stdout,在子进程中运行它。这可以根据需要为您提供单独的终端输出。
但是,如果您想要同时运行$('.heart').click(function(){
$(this).toggleClass('active');
if( $('.heart').hasClass('active') ) {
/* Change*/
}
else {
/*Cancel change*/
}
});
并访问变量,那么您需要考虑线程。
答案 2 :(得分: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
答案 3 :(得分:0)
是的,您可以使用Python来控制使用stdin / stdout的另一个程序,但是当使用另一个进程输出时,通常存在缓冲问题,换句话说,其他进程在输出之前并没有真正输出任何内容。已完成。
甚至有些情况下输出是否被缓冲,具体取决于程序是否从终端启动。
如果您是两个程序的作者,那么最好使用另一个进程间通道,其中刷新由代码明确控制,如套接字。