嵌入式Python找不到一些模块(ctypes,..)

Embedded Python does not find some modules, (ctypes, ...)

本文关键字:ctypes 模块 Python 找不到 嵌入式      更新时间:2023-10-16

我正在尝试运行一些嵌入式python代码。
虽然其中一些工作正常,但有些导入不起作用。

// pseudo code
...
Py_SetPath("//path//to//python35.zip");
...
Py_Initialize();
PyEval_InitThreads();
char * s = "import ctypesnnctypes.windll.user32.LockWorkStation()";
...
PyObject *main_module = PyImport_AddModule("__main__");
PyObject *main_dict = PyModule_GetDict(main_module);
...
PyObject * PyRes = PyRun_String(s, Py_file_input, main_dict, main_dict);
...

事实上,如果我所做的只是打电话,

...
char * s = "import ctypes";
...

我收到一个错误(找不到"ctypes")。

但是如果我这样做...

...
import time
t = time.ctime()
...

它工作正常,所以很明显有些模块被加载了,而另一些则没有。

关于为什么"ctypes"会抛出错误而其他人不会抛出错误的任何建议?

编辑 : 更多代码...

#include <python.h>
int main()
{
  ////////////////////////////////////////////////////////////////////////
  Py_SetPath( L"path\to\python35.zip" );
  Py_Initialize();
  PyEval_InitThreads();
  PyThreadState *mainstate = PyThreadState_Get();
  PyEval_ReleaseLock();
  //
  // ...
  //
  // run the code.
  PyEval_AcquireLock();
  PyInterpreterState* mainInterpreterState = mainstate->interp;
  PyObject *main_module = PyImport_AddModule("__main__");
  PyObject *main_dict = PyModule_GetDict(main_module);
  Py_INCREF(main_module);
  PyObject *local_dic = PyDict_New();
  Py_XINCREF(local_dic);
  // we can now run our script
  const char* s = "import ctypes";
  PyObject * PyRes = PyRun_String(s, Py_file_input, main_dict, local_dic);
  PyObject* ex = PyErr_Occurred();
  if (NULL != ex)
  {
    //  didn't work, import error.
  }
  PyErr_Clear();
  PyDict_Clear(local_dic);
  Py_XDECREF(local_dic);
  Py_DECREF(main_module);
  PyThreadState_Swap(NULL);
  PyThreadState_Swap(mainstate);
  PyEval_ReleaseLock();
  //
  // ...
  //
  // close
  PyEval_AcquireLock();
  PyThreadState_Swap(mainstate);
  Py_Finalize();
  //////////////////////////////////////////////////////////////////////////
}
上面的

代码是正确的,"问题"在于可嵌入的。它用于发布分发而不是调试(这是设计使然)。

在示例代码中,python dll 在调试中查找_ctypes_d.pyd,但 redist 只有_ctypes.pyd因此它找不到模块的原因。

Python 开发人员将撰写一篇关于嵌入式 zip 用法的博客。

该代码包含一个项目_ctypes.vcxproj,如果要生成 _ctypes_d.pyd python 模块,可以生成该项目。

请参阅我在 python.org 上创建的错误报告

我必须修复包含,它应该是Python.h而不是python.h,然后我可以编译并运行您的代码来重现问题。现在,问题是由

Py_SetPath(L"path\to\python35.zip");

这弄乱了 Python 搜索其他模块的路径,即那些没有硬编译到解释器二进制中的模块。这也是为什么有些require语句有效而另一些则无效的原因。那些工作不需要正确的路径,因为它们不需要任何其他文件。

作为参考,你也可以从 Python 内部获得相同的行为:

Python 3.4.2 (default, Oct  8 2014, 10:45:20) 
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path = ['/path/to/some/archive.tar.gz']
>>> import time
>>> import ctypes
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'ctypes'
>>>