如何使用子进程从函数返回变量?

时间:2017-08-25 18:32:20

标签: python linux return subprocess stdout

我有一个非常初学的问题。我正在尝试执行以下操作,我需要使用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

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

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

5 个答案:

答案 0 :(得分:0)

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

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

如果您决定将其视为模块并将其导入,则可以获得函数的返回值。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

试试这个:

<强> 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)

答案 4 :(得分:0)

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

#if __name__ == "__main__":

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

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

对返回结果的限制的一种方法是使用管道来捕获被调用的进程print或以其他方式发送到其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

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