使用参数(对象数组)从python2脚本调用python3方法并接收输出

时间:2018-06-17 13:58:35

标签: python python-3.x python-2.x

我的问题类似于this,但是我的情节和实际代码略有不同,我需要调用一个函数给它2个参数,其中一个是对象数组(如示例python2所示)文件代码)并接收输出,也是一个对象数组(为简化起见,未在此示例代码中显示)。

我的python2文件:

#!/usr/bin/env python
from subprocess import call
if __name__ == "__main__":
    pathToFile = '/home/scripts/'
    arr = [{'x': 1, 'y': 2, 'z': 3}, {'x': 2, 'y': 2, 'z': 2}]
    output = call([pathToFile + 'python3', 3, arr])

我的python3文件:

#!/usr/bin/env python3
import numpy as np
import sys
def python3Function(poses,kernelCount):
    #complex calculations using py3 functionalities hidden for minified example
    x = 3
    y = 5
    z = np.atleast_1d(x) @ np.atleast_1d(y) 
    return z

if __name__ == "__main__":
    kernelCount= sys.argv[1] 
    poses= sys.argv[2]  
    print(python3Function(poses,kernelCount))

目前看来调用方法只接受字符串,因为我得到以下错误:
TypeError: execv() arg 2 must contain only strings
直接导入该方法也不起作用,因为它使用python特定的语法,如@,并导致错误:
SyntaxError: invalid syntax

链接问题的答案给了我两个选项,我引用:

  • 通过管道或插座说话
  • __future__启用此类python 3功能或使用 类似六的库来编写与两者兼容的代码。

我完全不知道那个人在谈论什么以及我应该在我的案例中使用哪三种方法......我需要实际代码用于我的例子,越简单就越好,然后我会理解。

1 个答案:

答案 0 :(得分:1)

在给定subprocess模块实现的UNIX进程模型的情况下,不能将任意对象传递给子进程。你只能传递字符串。因此,您需要将对象序列化(即编码)为字符串,并在子进程中对其进行反序列化(即解码)。大多数其他IPC(进程间通信)机制都是如此。

有很多方法可以做到这一点。显而易见的是使用repr()来序列化(即编码)对象。这个显而易见的解决方案的问题是将序列化数据转换为对象是不安全的,因为它通常会导致代码接收序列化数据到eval字符串。这意味着它是一个安全漏洞。您应该使用在这种情况下可以安全使用的编码。例如JSON或Google protobufs。