【问题标题】:How to return a variable from a function using subprocess?如何使用子进程从函数返回变量?
【发布时间】:2018-02-03 20:48:48
【问题描述】:

我有一个非常初级的问题。我正在尝试执行以下操作,我需要使用 subprocess 从另一个 Python 脚本获取列表。

1 级:

#!/usr/bin/python

import sys
import os

def run(a):
    print "running"
    return a

#if __name__ == "__main__":
    run(str(sys.argv[1]))

0 级:

import sys
import os
import subprocess

output = subprocess.check_output(['python','level1.py','test'])
print output

但是,当我运行它时,输出会打印出“正在运行”,而不是存储在变量 a 中的值。

我想知道如何获取 a 的值而不是所有 print 语句。

【问题讨论】:

  • 退出状态是一个 7 位整数。您不想尝试将其用于任意返回值。打印到标准输出并捕获标准输出是正确的。如果“正在运行”是一条日志消息,而不是输出,则应将其打印到 stderr 以使其保持在带外。
  • 就像查尔斯说的那样,用“print a”替换你的“return a”,你应该会很好。您还想删除“打印运行”语句,因为那不是您要捕获的内容
  • 感谢大家的回复。我会试一试。
  • 既然您注释掉了 if __name__ 语句,那么缩进规则说您对 run() 的调用将成为函数的一部分,并且不会执行任何操作(因为您之前有一个 return它)。

标签: python linux return subprocess stdout


【解决方案1】:

看看https://stackoverflow.com/a/7975511/3930971

您正在使用另一个系统进程来运行脚本,它不会告诉您系统的其余部分返回对run() 的调用的值。系统的所有其余部分看到的是定向到输出(stdout、stderr)的内容,您当前的脚本只发送"running" 到输出,所以这就是子进程看到的。

如果你决定把它当作模块并导入它,你可以获得函数的返回值。

【讨论】:

  • 感谢chico的回复。我会试一试。
【解决方案2】:

一旦您在 run 函数中点击 return 语句,该文件就会结束并且不再执行任何代码: 你甚至可以这样做:

def run(a):
  print "Running: ", a

【讨论】:

    【解决方案3】:

    level1.py 从不打印run() 返回的值。改为:

    print(run(sys.argv[1]))
    

    顺便说一句,没有必要使用str(),因为argv 的元素总是字符串。

    【讨论】:

      【解决方案4】:

      试试这个:

      level1.py

      import sys
      import os
      
      def m1(a):
          for elements in a:
              print(elements)
      

      level0.py

      import level1
      
      a = ['first','second','third']
      output = level1.m1(a)
      print(output)
      

      【讨论】:

        【解决方案5】:

        部分问题是leve1.py 中的注释行:

        #if __name__ == "__main__":
        

        搞砸了,因为它导致 run(str(sys.argv[1])) 被认为是 run() 函数的最后一行——由于之前的 return 语句,它永远不会被执行。

        另一个是你只能从subprocess.check_output获取子进程的返回码,这是一个7位整数值。

        绕过对返回结果的限制的一种方法是使用管道来捕获被调用进程prints 或以其他方式发送到其sys.stdout(和stderr,如下所示)的任何内容。首先将run()修改为print的结果,而不是return

        level1.py:

        import sys
        import os
        
        def run(a):
            print "running"
            print a
        
        run(str(sys.argv[1]))
        

        然后修改驱动程序以获取并显示输出到stdout的内容:

        level0.py:

        import sys
        import os
        import subprocess
        
        kwargs = dict(stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
                      universal_newlines=True)
        with subprocess.Popen(['python','level1.py','test'], **kwargs).stdout as output:
            for line in output:
                print line,
        

        输出:

        running
        test
        

        另一种方法是使用多处理模块,它允许您传回任意值(不仅仅是字符串)。

        【讨论】:

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