我正在尝试将 Python 嵌入到 C++ 中。我正在尝试使用 documented API 来配置 Python 系统路径,以便可以从 C++ 导入任意模块。但是路径配置不正确,因为除非我将模块移到与可执行文件相同的目录中,否则无法导入模块。显然我没有正确使用 API。这是我的代码:
error_t init_path(PyConfig* config, wchar_t** paths, int num_paths) {
if (num_paths) {
PyStatus status;
//status = PyConfig_SetBytesString(config, &config->program_name, "C:/Python311/python.exe");
//status = PyConfig_SetBytesString(config, &config->program_name, "D:/work/projects/common_hdl/pysim/cosim/x64/Debug/cosim.exe");
status = PyConfig_Read(config);
config->module_search_paths_set = 1;
for (int i = 0; i < num_paths; i++) {
status = PyWideStringList_Append(&config->module_search_paths, paths[i]);
if (PyStatus_Exception(status)) {
fprintf(stderr, "Could not add path %ls\n", paths[i]);
return PATH_INSERTION_ERR;
}
else {
printf("Appending %ls to system path\n", paths[i]);
}
}
status = Py_InitializeFromConfig(config);
if (PyStatus_Exception(status)) {
fprintf(stderr, "Unable to initialize python\n");
return INIT_ERR;
}
}
return NONE;
}
我认为初始化路径的记录步骤是:
但是...
从 Python 文档中非常不清楚“program_name”指的是什么以及为什么(或是否)需要初始化它。我已经尝试了一些实验,正如您在我的代码中看到的那样。
上面的代码根本不起作用。任何人都可以发现问题或解决我对配置过程的解释吗?我知道还有其他方法可以允许运行 python 代码来操纵系统路径。但我真的很想使用 API 方法来做到这一点。
当我移动 python 文件时,我尝试导入到与可执行文件相同的目录中并打印“sys.path”的内容
这种情况有用吗?
这会让我认为您的
PyWideStringList_Append(&config->module_search_paths...)
调用出了问题:该文件的路径是否在路径列表中?
我使用类似 L"C:\\tests\\pyfiles_to_load"
(显然在 Windows 上)的东西,其中有一个 .py 文件,然后我可以加载。
据我了解,名称(
&config->program_name
)不一定是路径或可执行文件名,它只是一个名称(例如Test_PythonCcall
)。
此外,PyConfig 结构中还有其他条目,例如 pythonpath_env、base_prefix 等。也许这些是您想要修改的?