我正在尝试从Python 3.4执行IronPython脚本。 我在IronPython脚本中有函数,它返回一个字典,我希望将该字典放到python 3.4区域。
我正在使用Subprocess.call从Python 3.4运行IronPy脚本
所以,我想知道有没有办法让外部(IronPy)程序的返回值进入python 3.4区域。
答案 0 :(得分:0)
您无法直接从子流程返回对象。 "返回值"进程只是一个0-127之间的数字(你传递给sys.exit
的数字,如果你刚刚从程序末尾掉下来就是0),这不是很有用。
但是,子进程 通过管道连接:如果您只运行check_output
而不是call
的子进程,无论它写入stdout
的字节是什么,可以阅读。
因此,如果您可以将数据转换为字节流并返回,那么它很容易。
如果dict中的数据都是简单类型(NoneType,bool,int,float,str,list,dict),请使用json
对其进行编码。
或者,如果它们是您在CPython和IronPython之间共享的.py文件中定义的所有内置/ stdlib类型和类型,请使用pickle
对其进行编码。
或者,如果他们可以表示为固定的C类结构,则可以使用struct
或ctypes
模块。
等
例如:
# parent.py
import json
import subprocess
result = subprocess.check_output(['ironpython.exe', 'myironscript.py'],
universal_newlines=True)
result_dict = json.loads(result)
print(result_dict["key"])
和
# child.py
import json
def do_the_work():
return {'key': 'value', 'other': 'stuff'}
result = do_the_work()
print json.dumps(result)
当你运行它时,它会打印出value
。
(因为json.dumps
默认转义任何不是纯ASCII的东西,你可以安全地将其作为文本而不是字节传递。对于大多数其他格式,你将要使用{{1在孩子中而不是sys.stdout.write
,并将print
从父母那里移开。)