从IronPython到Python中获取返回值

从IronPython到Python中获取返回值,python,python-3.x,subprocess,ironpython,Python,Python 3.x,Subprocess,Ironpython,我正在尝试执行Python3.4中的IronPython脚本。 我在IronPython脚本中有一个函数,它返回一个字典,我想把这个字典放到Python3.4区域 我正在使用Subprocess.call从Python 3.4运行IronPy脚本 所以,我想知道有没有办法将外部(IronPy)程序的返回值输入到python 3.4区域。您不能直接从子进程返回对象。进程的“返回值”只是0-127之间的一个数字(传递到的数字,或者如果程序结束,则为0),这不是很有用 但是,子进程是通过管道连接的:如

我正在尝试执行Python3.4中的IronPython脚本。 我在IronPython脚本中有一个函数,它返回一个字典,我想把这个字典放到Python3.4区域

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


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

您不能直接从子进程返回对象。进程的“返回值”只是0-127之间的一个数字(传递到的数字,或者如果程序结束,则为0),这不是很有用

但是,子进程是通过管道连接的:如果您只是使用而不是
调用运行子进程
,那么无论它写入
标准输出
,您都可以读取

因此,如果您可以将数据转换为字节流并返回,那么就很容易了

  • 如果dict中的数据都是简单类型(NoneType、bool、int、float、str、list、dict),则使用
    json
    对其进行编码

  • 或者,如果它们都是内置的/stdlib类型以及在CPython和IronPython之间共享的.py文件中定义的类型,则使用
    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"])
以及:

运行此命令时,它将打印出


(因为
json.dumps
默认转义非纯ASCII的内容,所以可以安全地将其作为文本而不是字节传递。对于大多数其他格式,您希望在子级中使用
sys.stdout.write
,而不是
print
,并将
universal\u newlines=True
保留在父级之外。)

IronPython就是Python。为什么需要调用一个单独的进程?@DanielRoseman:我想他想调用一些.NET代码,但他也想做一些特定于3.x的东西,而且因为没有3.x IronPython…说得很对。
# child.py
import json

def do_the_work():
    return {'key': 'value', 'other': 'stuff'}

result = do_the_work()
print json.dumps(result)