嵌入式python系统路径配置

问题描述 投票:0回答:1

我正在尝试将 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;
}

我认为初始化路径的记录步骤是:

  1. 初始化PyConfig数据结构
  2. 在数据结构中设置program_name
  3. 读取配置数据
  4. 将 module_search_paths_set 字段设置为 1
  5. 使用 PyWideStringList_Append 方法在数据结构中追加“module_search_paths”字段。
  6. 使用新配置运行 Py_InitializeFromConfig 方法。

但是...

从 Python 文档中非常不清楚“program_name”指的是什么以及为什么(或是否)需要初始化它。我已经尝试了一些实验,正如您在我的代码中看到的那样。

上面的代码根本不起作用。任何人都可以发现问题或解决我对配置过程的解释吗?我知道还有其他方法可以允许运行 python 代码来操纵系统路径。但我真的很想使用 API 方法来做到这一点。

python configuration
1个回答
0
投票

当我移动 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 等。也许这些是您想要修改的?

© www.soinside.com 2019 - 2024. All rights reserved.