我想知道什么是最好的做法,当你想"返回"来自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(以及程序集),那么资源文件将复制到根目录,这会在我使用多处理模块调用多个进程时产生冲突。如果您对这个整体架构有一些建议,那么非常欢迎:)。
由于
答案 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