subprocess.Popen,从子进程(子)中获取变量[重复]
Posted
技术标签:
【中文标题】subprocess.Popen,从子进程(子)中获取变量[重复]【英文标题】:subprocess.Popen, get variable from subprocess (child) [duplicate] 【发布时间】:2018-06-20 21:39:37 【问题描述】:我想知道如何处理它,我从子进程获取一个变量/值到父进程。
我将子进程作为脚本运行。 父母看起来像:
import subprocess
p = subprocess.Popen('abaqus python getData.py', shell=True)
p_status = p.wait()
print b
孩子的样子:
from numpy import *
if __name__ == "__main__":
b = [0,1,2,3] # output is a list of integers
global a = b
我对 python 完全陌生。我认为问题是,我不能以这种方式存储变量并将它们“公开”给父级?我是否必须将它们写在 *.txt 或类似的文件中并使用 numpy.loadtxt() 获取它们?
【问题讨论】:
这是两个不同的过程。您不能像这样共享数据。你真的必须创建另一个进程吗? @Jean 是啊,我必须这样做,因为 abaqus 使用他自己的 python 编译器和包“odbAccess”。有了它,我可以包装 *.odb 文件中的数据,但我无法根据需要导入包“metaplotlib”。所以我启动python编译器,通过parant运行abaqus python编译器,并希望将值返回给父级,这样我就可以从数据中制作一些图。顺便提一句。我很抱歉我的英语。 你从子进程返回的对象的类型是什么? 它是一个整数列表 @Jean-FrançoisFabre 知道我该如何处理吗?谢谢:) 【参考方案1】:即使子进程是python进程,也无法使用全局变量在它们之间进行通信。
您也不能使用 multiprocessing.Manager
对象,因为您需要 2 个不同的 Python 引擎(具有单独的功能)。
经典(且简单)的方法是使用简单的print
序列化数据(因为输出中有整数列表),并使用ast.literal_eval
反序列化(json
也可以)
被调用者(getData.py
样机):
if __name__ == "__main__":
print([1,2,3,4]) # mock output
来电者:
import subprocess,ast
output = subprocess.check_output('abaqus python getData.py', shell=True)
lst = ast.literal_eval(output.decode("ascii"))
现在lst
包含[1,2,3,4]
如果您的输出数据更复杂(列表列表、字典...),只需编写列表列表、包含嵌套字典的字典...并打印出来。 ast.literal_eval
能够在另一侧重建相同的结构。
【讨论】:
通过将参数作为数组传递来展示如何避免对shell=True
的依赖可能是一种好习惯。
我稍后会检查这个。非常感谢。 :) 有没有办法隐藏打印?我可以在“背景”中运行打印。
print
将被隐藏,因为check_output
使用它而不打印它。
@Jean-FrançoisFabre 好的,这很酷!你是我今晚的个人英雄。 ? 谢谢!
如果你有 3 个数组,把它们放在一个列表中,打印出来:完成。这就是像这样序列化的重点。您可以序列化复杂的结构,例如字典、列表列表、具有多个级别的字典列表...以上是关于subprocess.Popen,从子进程(子)中获取变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章