【问题标题】:Start a subprocess, wait for it to complete and then retrieve data in Python启动一个子进程,等待它完成,然后在 Python 中检索数据
【发布时间】:2016-06-19 23:26:27
【问题描述】:

我正在努力获取一些 python 脚本来启动子进程,等到它完成然后检索所需的数据。我对 Python 很陌生。

我希望作为子进程运行的命令是

    ./bin.testing/Eva -t --suite="temp0"

在 Linux 终端中手动运行该命令会产生:

    in terminal mode
    Evaluation error = 16.7934

我想将命令作为 python 子进程运行,并接收返回的输出。但是,我尝试的一切似乎都跳过了第二行(最终,这是我想要的第二行。)目前,我有这个:

    def job(self,fen_file):
        from subprocess import Popen, PIPE
        from sys import exit

        try:
            eva=Popen('{0}/Eva -t --suite"{0}"'.format(self.exedir,fen_file),shell=True,stdout=PIPE,stderr=PIPE)            
            stdout,stderr=eva.communicate()
        except:
            print ('Error running test suite '+fen_file)
            exit("Stopping")

        print(stdout) 
        .
        .
        .
        return 0

这一切似乎产生的是

    in terminal mode

    0

缺少重要的行。 print 语句只是为了让我可以看到我从子流程返回的内容 - 目的是它将替换为处理第二行中的数字并返回输出的代码(这里我只是返回0 只是为了让这个特定的位首先工作。这个函数的调用者打印结果,这就是为什么输出末尾有一个零。) exedir 只是子进程的可执行文件的目录,而fen-file只是子进程需要的一个ascii文件。我已经尝试从子进程的源代码中删除“终端模式”并重新编译它,但这不起作用——它仍然没有返回重要的第二行。

提前致谢;我希望我做错的事情真的很简单。

编辑:我应该补充一点,子流程 Eva 可能需要一两秒才能完成。

【问题讨论】:

    标签: python linux subprocess


    【解决方案1】:

    由于第二行是错误消息,它可能存储在您的stderr 变量中!

    要确定您可以在代码中打印stderr,或者您可以在命令行上运行程序并查看输出是否拆分为stdoutstderr。一种简单的方法是使用./bin.testing/Eva -t --suite="temp0" > /dev/null。您收到的任何消息都是stderr,因为stdout 被重定向到/dev/null

    此外,除非真的需要,否则通常不鼓励使用 Popen 选项 shell=True。而是传递一个列表:

    [os.path.join(self.exedir, 'Eva'), '-t', '--suite=' + fen_file], shell=False, ...
    

    如果您的参数之一通常由 shell 解释,这可以避免问题。 (注意,我删除了""'s,因为外壳通常会为你吃掉那些!)

    【讨论】:

    • 嗨,也许“评估错误”具有误导性,但它不是错误消息:它是计算计算量与测量量之间的平方差的子过程的所需输出。但是,按照您的建议传递一个列表,删除 shell=true 并删除双引号就可以了。谢谢!
    • @ppyvabw 你知道,它可能是"--suite"{0}"——我没有提到你错过了=,但在我的版本中包含了它!
    【解决方案2】:

    尝试使用子进程 check_output。

    output_lines = subprocess.check_output(['./bin.testing/Eva', '-t', '--suite="temp0"'])
    for line in output_lines.splitlines():
        print(line)
    

    【讨论】:

      猜你喜欢
      • 2016-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 2012-02-15
      • 1970-01-01
      相关资源
      最近更新 更多