从IronPython获取返回值到Python

时间:2015-04-20 08:03:49

标签: python python-3.x subprocess ironpython

我正在尝试从Python 3.4执行IronPython脚本。 我在IronPython脚本中有函数,它返回一个字典,我希望将该字典放到python 3.4区域。

我正在使用Subprocess.call从Python 3.4运行IronPy脚本

所以,我想知道有没有办法让外部(IronPy)程序的返回值进入python 3.4区域。

1 个答案:

答案 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类结构,则可以使用structctypes模块。


例如:

# 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从父母那里移开。)