【发布时间】:2014-10-30 13:58:15
【问题描述】:
我想知道当您想从 python 脚本“返回”某些内容时,最佳做法是什么。
这是我的问题。我正在使用 subprocess.Popen 方法从 parentScript 运行 Python childScript。我想从第一个脚本的执行中得到一个包含两个浮点数的元组。
现在,我看到的第一种方法是在子进程函数中使用 sys.stdout 和管道,如下所示:
child.py:
if __name__ == '__main__':
myTuple = (x,y)
sys.stdout.write(str(myTuple[0]) +":"+str(myTuple[1]))
sys.stdout.flush()
父.py:
p = subprocess.Popen([python, "child.py"], stdout=subprocess.PIPE)
out, err = p.communicate()
虽然here 说在大多数情况下不推荐,但我不知道为什么...
第二种方法是将我的元组写入 Script1.py 中的文本文件并在 Script2.py 中打开它。但是我想写和读文件需要一些时间所以我不知道这是否是一个更好的方法?
最后,我可以使用 CPickle 并转储我的元组并从 script2.py 打开它。我想这会比使用文本文件快一点,但会比使用 sys.stdout 更好吗?
正确的做法是什么?
---------------------------------------编辑-------- ------------------------------------------
我忘了提到我不能使用 import,因为 parent.py 实际上会在文件夹中生成 child.py。事实上,我正在做一些多处理。
Parent.py 创建了 10 个目录,其中 child.py 被复制到每个目录中。然后我在几个处理器上运行来自 parent.py 的每个 child.py。我希望 parent.py 收集所有 child.py “返回”的结果。所以 parent.py 不能导入 child.py 因为它还没有生成,或者我可以做某种动态导入?我不知道...
---------------------------EDIT2-------- ------------------------------------------
另一个编辑回答关于我为什么要这样做的问题。 Child.py 实际上调用 ironpython 和另一个脚本来运行 .Net 程序集。我必须复制特定文件夹中的所有 child.py 文件的原因是因为该程序集生成了一个资源文件,然后由它自己使用。如果我不在每个子文件夹中复制 child.py (顺便说一下程序集),则资源文件将复制到根目录,这在我使用多处理模块调用多个进程时会产生冲突。如果您对这个整体架构有一些建议,我们非常欢迎:)。
谢谢
【问题讨论】:
-
无关:一般来说,
script1.py、script2.py、float1、float2不是好名字。如果没有更具体的想法,您可以使用child.py、parent.py作为脚本,使用numbers或x, y作为数字。 -
好的,我现在正在编辑/补充它。谢谢!
标签: python subprocess popen sys