Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从另一个脚本控制python脚本_Python - Fatal编程技术网

从另一个脚本控制python脚本

从另一个脚本控制python脚本,python,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 continu

我试图学习如何编写脚本
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脚本在另一个脚本运行时控制它(例如,访问它打印的内容等等)
  • 最后,是否可以在新的终端(即不在
    control.py
    的终端)中运行
    test.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", "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

是的,您可以使用Python使用stdin/stdout控制另一个程序,但是当使用另一个进程输出时,通常存在缓冲问题,换句话说,另一个进程在完成之前不会真正输出任何东西

甚至在某些情况下,输出是否缓冲取决于程序是否从终端启动


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

您可以使用子进程模块或os.popen

os.popen(command[, mode[, bufsize]])
打开管道到或从命令。返回值是连接到管道的打开文件对象,根据模式是“r”(默认)还是“w”,可以读取或写入该对象

我建议使用子流程

subprocess.call(['python.exe', command])
或者类似于os.Popen的subprocess.Popen-->子进程(例如)

使用popen,您可以读取连接的对象/文件,并检查是否存在“立即停止”

os.system没有被弃用,您也可以使用它(但您不会从中获得对象),您只需在执行结束时检查是否返回

在subprocess.call中,您可以在新的终端中运行它,或者如果您只想多次调用test.py-->则可以将脚本放入def main()中,并根据需要运行main,直到生成“立即停止”为止

希望这能解决您的疑问:-)否则请再次评论

查看上面写的内容,您还可以直接从操作系统调用-->OS.system(test.py*args>>/tmp/mickey.txt)将输出重定向到一个文件,然后您可以在文件的每一轮进行检查


如前所述,popen是一个您可以访问的对象文件。

您在对Marc Cabos回答的评论中暗示的是

Python可以通过多种方式使用其他文件的功能。如果
test.py
的内容可以封装在函数或类中,那么您可以
将相关部分导入到程序中,使您能够更好地访问该代码的运行

如其他答案中所述,您可以使用脚本的标准输出,在子流程中运行它。这可以根据需要为您提供单独的终端输出


但是,如果您想同时运行<代码> Test.Py <代码>,并且随着变量的变化而访问变量,则需要考虑线程。

os.system
已弃用;您应该使用
子流程
模块在新终端中运行test.py,您需要启动该流程,例如
子流程.call([“xterm”、“-e”、“python”、“test.py”、“someargument”)
您可能感兴趣。@zondo neat!您能在这里举个例子吗?使用pexpectHi,谢谢你的建议。如果我没弄错的话,回答是,错误只有在p完成后才被填充,对吗?我有点想读取正在运行的子流程“prints”,然后在打印中打印“stop now”时停止该子流程。这是可以实现的吗?测试它是否正常工作。。。我现在无法检查(只是编码)。非常感谢,我现在就试试。我猜你是想在第二个条件之后编写
中断
,对吗?如果我有多个子进程,那么,例如p、p2、p3,我如何才能执行你建议的while循环,但特别是对于进程p,我问你,因为你只是编写了
而为True:
但是现在有了多个子进程,我想执行相同的循环,除了进程p,所以像
这样的东西,而p==True:
但是这不起作用?(因为我只关心
test.py
打印的内容,而不关心它所做的其他事情,所以我想如果我在另一个终端上运行它,那么也许我有机会阅读终端本身来了解
test.py
打印的内容)谢谢Marco,我将尝试一个简单的脚本并尝试这个想法,我会给你回复你想要的是线程。这是你最终需要的:-)我上面建议的要简单一些,但是线程是正确的答案,我想:-)祝你度过愉快的一天。我在我的帖子中添加了第一次尝试。它可以做一些我想做的事情。剩下的就是在一个新的终端中调用子进程(在ubuntu上),有什么想法吗?不确定creation标志是否会在Popen中对这种特殊情况有所帮助。creationflags=CREATE_NEW_控制台。您也可以在此处查看子流程文档:希望这对您有所帮助:-)CREATE_NEW_控制台仅适用于windows我想,我正在运行ubuntuoh哇,我学到了很多。事实上,在这个具体的例子中,我只是在这里尝试访问
test.py
的打印输出。如果您想看一看,我在我的帖子中添加了一个失败的尝试
subprocess.call(['python.exe', command])