我有一个非常初学的问题。我正在尝试执行以下操作,我需要使用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
语句的值。
答案 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
另一种方法是使用多处理模块,它允许你传回任意值(而不仅仅是字符串)。