gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:19:42 29 4
gpt4 key购买 nike

我的问题类似于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))

目前,调用方法似乎只接受字符串,因为我收到以下错误:
类型错误:execv() arg 2 必须仅包含字符串
直接导入该方法也不起作用,因为它使用 Python 特定语法,如 @ 并导致错误:
SyntaxError:语法无效

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

  • 通过管道或套接字进行交谈
  • __future__ 启用此类 Python 3 功能或使用像六个这样的库来编写与两者兼容的代码。

我完全不知道那个人在说什么,也不知道在我的例子中我应该使用这 3 种方法中的哪一种...我的示例需要实际代码,越简单越好,然后我就会理解。

最佳答案

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

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

关于python - 使用参数(对象数组)从 python2 脚本调用 python3 方法并接收输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50897349/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com