gpt4 book ai didi

带有数据文件的 Python C 扩展

转载 作者:行者123 更新时间:2023-11-28 19:26:21 24 4
gpt4 key购买 nike

我正在尝试为 Python 编写和安装一个 C 扩展,它必须加载一个 120MB 的数据文件。使用 distutils package_data 参数,我已经将数据文件正确安装到与扩展模块相同的文件夹中。但是,C 代码不知道如何找到数据文件。

我可以在 C 扩展中硬编码已安装数据文件的路径(可行),但这显然不适用于具有不同安装目录的系统。我需要在 Linux 和 Windows 下安装此扩展。

我已经尝试使用 PyModule_GetFilename() 获取模块的路径,然后从中构建数据文件的路径,但是该函数引发了 SystemError: module filename missing。错误可能是因为我试图在我的模块初始化函数中调用它?

如有必要,我可以在模块初始化之外手动加载数据文件,但我更愿意在导入时自动加载文件。

编辑:所以,我找到了解决方法。我写了一个初始化函数,它可以将文件的路径作为参数。在 Python 中,我可以访问模块的 __file__ 属性并从那里找出数据文件的路径。然后,如果我在 __init__.py 中运行初始化函数,一切正常。虽然这可行,但我仍然希望有人能给我一个更优雅的解决方案,因为这对我来说感觉很落后!

最佳答案

所以我自己想出了一个更好的解决方案,并认为我会发布它以防它对其他人有帮助。

我的项目由一个带有 C 扩展名的包 (my_module) 组成。安装包含 _my_extension.so__init__.pydatafile.dat。在相关部分,__init__.py 看起来像:

import os

def datafile_path():
return os.path.join(os.path.dirname(__file__), "datafile.dat")

import _my_extension

我的 C 扩展初始化函数如下所示:

PyMODINIT_FUNC
init_my_extension(void)
{
PyObject *m, *fileobj, *pModule, *pFunc;

m = Py_InitModule3("_my_extension", _my_extension_methods, "A docstring");
if (m == NULL)
return;

pModule = PyImport_ImportModule("my_module");
pFunc = PyObject_GetAttrString(pModule, "datafile_path");
fileobj = PyObject_CallFunction(pFunc, NULL);
Py_DECREF(pFunc);

LoadDataFile(PyString_AS_STRING(fileobj));

Py_DECREF(fileobj);
Py_DECREF(pModule);
}

显然我需要添加一些错误处理,这看起来仍然有点不对劲,但至少它在模块初始化时加载了数据文件,并且可以正常工作。显然我可以在 C 中完成大部分 datafile_path 计算,但由于无论如何我都需要导入模块,并且由于我想要跨平台兼容性,因此使用 os< 似乎更容易 模块。

无论如何,如果有人能告诉我如何更好地做到这一点,我仍然会很高兴,所以我会保持开放状态,但我想我会提出一个答案,以帮助遇到同样问题的任何人,以防万一没有更好的答案即将到来,因为我认为它可能会澄清问题。

关于带有数据文件的 Python C 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11024089/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com