嵌入式Python找不到一些模块(ctypes,..)
Embedded Python does not find some modules, (ctypes, ...)
我正在尝试运行一些嵌入式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'
>>>
相关文章:
- 尝试导入pybind-opencv模块时出现libgtk错误
- Ctypes wstring通过引用传递
- 在C++代码中包含opencv时,使用ctypes创建.so文件
- 为什么当我解模块化时,这个C++代代码"效率较低"?
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 内联如何影响模块接口中的成员函数
- C++返回 Numpy 数组的 Python 扩展模块
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- Python ctypes:不会按预期加载 dll
- 如何从线程中的不同模块调用函数?
- 如何使用 soong 命名空间来有条件地编译模块
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- 将 ctypes 与 tesserac-ocr 一起使用的例外 TessPageIteratorBoundingBox.
- CMake - 模块 + 库混淆
- 特征 LLT 模块给出不正确的结果?
- 枚举进程模块在有效句柄上返回无效句柄
- 在 python 模块中导入子模块时PyImport_Import失败
- 如何使用 ctypes 停止和重新启动从 Python 运行的C++代码
- 嵌入式Python找不到一些模块(ctypes,..)