Python subprocess.Popen:sys.stdout vs .txt file vs Cpickle.dump

时间:2014-10-30 13:58:16

标签: python subprocess popen sys

我想知道什么是最好的做法,当你想"返回"来自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()

parent.py:

 p = subprocess.Popen([python, "child.py"], stdout=subprocess.PIPE)
 out, err = p.communicate()

尽管here它表示在大多数情况下不建议这样做,但我不知道为什么......

第二种方法是将我的元组写入Script1.py中的文本文件并在Script2.py中打开它。但我想写作和阅读文件需要一些时间,所以我不知道这是否是一种更好的方法?

最后,我可以使用CPickle并转储我的元组并从script2.py中打开它。我想这会比使用文本文件快一点,但它会比使用sys.stdout更好吗?

什么是正确的方法?

--------------------------------------- EDIT ------- -----------------------------------------

我忘了提到我不能使用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(以及程序集),那么资源文件将复制到根目录,这会在我使用多处理模块调用多个进程时产生冲突。如果您对这个整体架构有一些建议,那么非常欢迎:)。

由于

1 个答案:

答案 0 :(得分:2)

普通的,您应该使用import other_module并调用各种函数:

import other_module

x, y = other_module.some_function(param='z')

如果您可以运行该脚本,也可以导入它。

如果你想使用subprocess.Popen()然后传递几个浮点数,你可以使用json格式:它是人类可读的,精确的(在这种情况下),并且它是机器可读的。例如:

child.py

#!/usr/bin/env python
import json
import sys

numbers = 1.2345, 1e-20
json.dump(numbers, sys.stdout)

parent.py

#!/usr/bin/env python
import json
import sys
from subprocess import check_output

output = check_output([sys.executable, 'child.py'])
x, y = json.loads(output.decode())

  

Child.py实际上调用了ironpython和另一个运行.Net程序集的脚本。我之所以要复制所有child.py文件的原因是因为这个程序集生成了一个资源文件,然后由它使用。如果我不在每个子文件夹中复制child.py,则在我使用多处理模块调用多个进程时,会在根处复制资源文件,从而产生冲突。如果您对这个整体架构有一些建议,那么非常欢迎:)。

您可以将child.py中的代码放入parent.py并调用os.chdir()(在fork之后)以在其自己的工作目录中执行每个multiprocessing.Process或使用{{1如果使用cwd模块运行程序集,则参数(它设置子进程的当前工作目录):

subprocess