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,从子进程(子)中获取变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用Pyinstaller的Python子进程Popen

python中的subprocess.Popen()使用

如何使用子进程popen Python [重复]

Python分别从子进程stdout和stderr读取,同时保留顺序

可以python子进程Popen接受多个stdin流吗?

WMIC + Python 子进程/ (Windows 10)