使用 PythonNet 在一个进程中使用多个 Python 解释器?

问题描述

我正在尝试通过 PythonNet 在 C# 进程中托管多个 Python 运行时。

目前,我在使用这种方法时遇到了问题,我试图弄清楚这是否是我的问题,在一个进程中托管多个解释器是否通常是不可能的。我发现关于后者的信息相互矛盾,但一些开发人员似乎认为这“应该”是可能的。

我的方法实际上如下:

  1. 对于每个解释器,我首先将 PythonNet 的 PythonRuntime.dll 加载到专用的 AssemblyLoadContext
  2. 从加载的程序集,通过反射,我调用 PythonEngine.PythonHome =(conda 环境的路径)
  3. 这会触发 python39.dll 的加载尝试,我也通过我的自定义程序集加载器解决了这个问题 - 为了安全起见,我将 python39.dll 复制到一个随机名称的临时文件中,然后加载它。 (即:对于我生成的每个解释器,我实际上将 python39.dll 的单独副本加载到进程中)
  4. 我现在获取 Py.GIL() 并尝试通过 Py.Import("sys") 加载模块 - 这两者都是通过对单独加载的 PythonRuntime.dll 类型的反射来实现的

如果我只生成其中一个解释器,效果很好。但是,当我同时对一堆执行此操作时,导入“sys”模块会导致 System.AccessViolationException - 尝试读取由 PyImport_ImportModule 引起的写保护内存。

在这里做错了吗?甚至可以做到这一点,还是 cpython 实际上不支持这一点?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)