我的项目结构如下所示:
emb
| CMakeLists.txt
| main.c
| python35.lib
| stdlib.zip
| _tkinter.pyd
|
+---include
| |
| | abstract.h
| | accu.h
| | asdl.h
...
| | warnings.h
| | weakrefobject.h
|
+---build
| | emb.exe
stdlib.zip包含来自Python3.5.2安装的DLL、Lib和site-packages目录,其路径附加到sys.path
。我通过链接到python35.lib来隐式加载python35.dll,它包含DLL中所有导出函数的存根。下面是CMakeLists.txt的内容
cmake_minimum_required(VERSION 3.6)
project(embpython)
set(SOURCE_FILES main.c)
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
set(PYTHON_INCLUDE_DIR include)
include_directories(${PYTHON_INCLUDE_DIR})
target_link_libraries(
${PROJECT_NAME}
${CMAKE_CURRENT_LIST_DIR}/python35.lib
${CMAKE_CURRENT_LIST_DIR}/_tkinter.pyd)
下面是main.c的内容
#include <Python.h>
int main(int argc, char** argv)
{
wchar_t* program_name;
wchar_t* sys_path;
char* path;
program_name = Py_DecodeLocale(argv[0], NULL);
if (program_name == NULL)
{
fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
exit(1);
}
Py_SetProgramName(program_name);
path = "stdlib.zip;stdlib.zip/DLLs;stdlib.zip/Lib;"
"stdlib.zip/site-packages";
sys_path = Py_DecodeLocale(path, NULL);
Py_SetPath(sys_path);
Py_Initialize();
PySys_SetArgv(argc, argv);
PyRun_SimpleString("import tkinter\n");
Py_Finalize();
PyMem_RawFree(sys_path);
PyMem_RawFree(program_name);
return 0;
}
现在,这是我得到的错误:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File " ... emb\stdlib.zip\Lib\tkinter\__init__.py", line 35, in <module>
ImportError: DLL load failed: The specified module could not be found.
我做错了什么?我如何才能纠正它?
发布于 2016-11-15 07:14:47
只需在Jovito回答所有问题后进行更新,以指定如何使其成为轻型安装(步骤3到5,这将节省空间):
将\Pythonpath\DLLs\
中的_tkinter.pyd
文件复制到嵌入式安装的python35.dll
所在的目录中。您还需要2个DLL才能使tkinter
在同一位置tcl86t.dll
和tk86t.dll
中工作
您需要这些目录:\Pythonpath\Lib\tkinter
、\Pythonpath\tcl\tcl8.6
和\Pythonpath\tcl\tk8.6
,并且必须在main.py
脚本中进行设置,如下所示:
import os
os.environ['TCL_LIBRARY'] = "tcl//tcl8.6"
os.environ['TK_LIBRARY'] = "tcl//tk8.6"
这使得Jovito的答案尽可能轻量级。用他剩下的答案。这对我很有效。
https://stackoverflow.com/questions/40498491
复制相似问题