python版本可执行可嵌入_Python:在一个项目中使用支持不同Python版本的模块

我有2个

python模块,其中一个只支持

Python 2.x,另一个支持3.x.

不幸的是,我需要一个项目.

我现在的解决方法是让它们作为单独的程序自行运行,并通过套接字模块建立通信.

>我将以2个可执行文件结束,我想避免.

>两个模块之间的“连接”必须尽可能快.

所以我的问题是,如果有一种方法可以在某种程度上将两者结合到最后的一个可执行文件中,并且如果有一个更好的解决方案来快速通信,那么我现在拥有客户端 – 服务器构造.

最佳答案 确实没有好办法避免这种解决方法.

从概念上讲,没有理由不能将两个解释器嵌入到同一个过程中.但实际上,CPython解释器依赖于某些静态/全局状态.虽然3.7比那更好,比如3.0或2.6,但是这个状态仍然没有被消除.1而且,C链接的工作方式,没有办法解决这个问题而不改变解释器.

此外,嵌入CPython并不难,但这并不是一件容易的事,因为将解释器作为子进程运行是微不足道的 – 并且它可能比提出一种在子进程之间传递或共享状态的有效方法更难.

当然除了CPython之外还有其他的解释器.但是2.7和3.x版本的其他主要实现都不容易嵌入(PyPy),而且易于嵌入的两个版本没有3.x版本,也只能嵌入到另一个VM中,并且可以不要运行C扩展模块(Jython和IronPython).可以做一些事情,比如使用JEP在JVM中通过JNI嵌入CPython 3.7,同时在同一个JVM中本地使用Jython 2.7,但我怀疑这种方法对你有用.

同时,我提到在进程之间传递或共享数据通常并不难.

>如果您没有那么多数据,通常可以通过管道腌制它.

>如果你确实拥有大量数据,它通常或者可能存储在内存中的某些结构化形式的numpy数组,大量的ASCII或UTF-8文本,ctypes结构数组等等 – 你可以覆盖在mmap或共享内存段上.

>或者,当然,您可以提出自己的协议并通过(UNIX或IP)套接字与其进行通信.但是你不一定要跳到那个选项.

请注意,多处理支持前两个 – 虽然要利用独立的解释器来利用它,但你必须深入研究它的来源并提取你需要的位.还有第三方库可以提供帮助. (例如,如果你需要腌制本身不发泡的东西,答案通常就像“用莳萝替代泡菜”一样简单.)

1.以各种受限制的方式运行多个子解释器确实可以处理mod_wsgi之类的事情,而PEP 554旨在让事情处于一个状态,您可以在同一个过程中轻松,干净地运行多个3.7子解释器,但仍然完全没有像完全独立的嵌入式CPython-子解释器共享一个GIL,一个循环收集器,一个atexit处理程序等.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好,如果您想在C++项目使用两个不同版本Python虚拟环境,可以使用以下步骤: 1. 首先,您需要安装和配置您所需的两个Python版本,并创建两个虚拟环境分别安装所需的Python包。 2. 在C++项目,您可以使用Python C/C++ API来嵌入Python解释器并执行Python代码。您可以使用`Py_Initialize()`函数来初始化Python解释器,并使用`PyRun_SimpleString()`函数来执行Python代码。在执行Python代码之前,您需要使用`Py_SetPath()`函数将所需版本Python虚拟环境路径添加到Python路径。 3. 在C++项目,您可以使用`#include <Python.h>`来包含Python C/C++ API的头文件,并使用`-lpython`选项来链接Python。 4. 在执行Python代码之后,您需要使用`Py_Finalize()`函数来关闭Python解释器并释放资源。 下面是一个简单的示例代码,展示了如何在C++项目使用两个不同版本Python虚拟环境: ```c++ #include <Python.h> int main() { // 初始化Python解释器 Py_Initialize(); // 添加第一个虚拟环境路径到Python路径 Py_SetPath("/path/to/first/virtual/env"); // 执行一个虚拟环境Python代码 PyRun_SimpleString("import sys\nprint(sys.version)"); // 添加第二个虚拟环境路径到Python路径 Py_SetPath("/path/to/second/virtual/env"); // 执行第二个虚拟环境Python代码 PyRun_SimpleString("import sys\nprint(sys.version)"); // 关闭Python解释器 Py_Finalize(); return 0; } ``` 希望这个示例代码能够帮助您了解如何在C++项目使用两个不同版本Python虚拟环境。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值