如何在Python C API中安装python包文件夹路径?
假设我想从Python C-API ledger
打开一个文件data.txt
,其位置如下:
module.pyd
如何获取package
|--module.pyd
|--data
| |-data.txt
的路径名?
答案 0 :(得分:1)
该过程类似于纯Python的过程,如下所述:
因为你仍然可以在C扩展对象上查找__file__
。
>>> import wrapt._wrappers
>>> wrapt._wrappers.__file__
'/Users/graham/Python/wrapt-py36/lib/python3.6/site-packages/wrapt/_wrappers.cpython-36m-darwin.so'
在C代码中,您只需要使用C API完成这些步骤。
PyObject *module = NULL;
PyObject *file = NULL;
module = PyImport_ImportModule('package.module');
if (module) {
PyObject *dict = NULL;
dict = PyModule_GetDict(module);
file = PyDict_GetItemString(dict, "__file__");
if (file) {
...
}
Py_XDECREF(file);
}
Py_XDECREF(module);
然后,您需要删除路径的最后一段以获取目录并构造另一个文件的路径。我不会为此显示代码,这取决于是否想要自己在C代码中执行,或者尝试从Python调用os.path
函数。“/ p>
此外,通常最好将C扩展包装在精简的Python包装器中。这样,在Python代码中更容易做的这些事情可以作为一个函数在那里完成。然后,如果确实需要,您的C API代码可以调用纯Python函数。换句话说,只需将需要在C代码中填充的东西放在扩展中,并在Python包装器中做其他工作,就可以节省很多工作。