从另一个脚本

时间:2016-04-14 10:40:12

标签: python

我正在尝试学习如何编写脚本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进程自行完成,对吧?
  • 基本上试图学习如何使用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就是这样:(遵循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

4 个答案:

答案 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的另一个程序,但是当使用另一个进程输出时,通常存在缓冲问题,换句话说,其他进程在输出之前并没有真正输出任何内容。已完成。

甚至有些情况下输出是否被缓冲,具体取决于程序是否从终端启动。

如果您是两个程序的作者,那么最好使用另一个进程间通道,其中刷新由代码明确控制,如套接字。