python - 如何在 Python C 扩展中访问当前文件路径

标签 python c attributes python-c-api

在Python中,您可以使用__file__属性获取当前文件路径。

print(__file__)

如何从 Python C 扩展访问此属性?我尝试了以下代码,但该属性不存在。

if (PyObject_HasAttrString(module, "__file__")) {
    PyObject *string = PyObject_GetAttrString(module, "__file__");
    const char *path = PyUnicode_AsUTF8(string);
}

最佳答案

这取决于您何时想要访问 __file__ 属性以及创建模块的具体方式。

在单阶段初始化中(当您在 PyInit_yourmodulename 中调用 PyModule_Create 时)__file__ 设置之后 PyInit_* 函数被调用。因此,您只能在模块完全导入之后才能访问它。

multi-phase initialization ,其中 PyInit_yourmodulename 返回一个 PyModuleDef 对象,然后调用该 PyModuleDefPy_mod_create 插槽,您可以设置来自传递给 Py_mod_createspec 的文件名。 ModuleSpec对象有一个属性origin。这对应于加载模块的文件。因此,您可以从 spec.origin 设置模块的 __file__ 属性。

如果您在 PyInit_yourmodulename 系统之外创建模块(例如,从单个文件创建多个模块),那么您就不走运了,并且必须弄清楚__file__ 是你自己。

关于python - 如何在 Python C 扩展中访问当前文件路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70740825/

相关文章:

python - 在python中将字符输出到终端中的某个位置

c - 获取用户输入的第一个字符,丢弃 c 中的其余字符

c - 如何使用开罗和 Gtk3 在 GtkDrawingArea 中绘制一条线

c# - 将性能计数器与属性一起使用

magento - 以编程方式添加属性选项无法立即使用

python - Ghost.py 返回表单列表

python - 比较多维列表并返回相交索引

python - 如何在 Keras 中使用 Hausdorff 度量?

c++ - 将否定的 double 转换为 int

swift - Swift 中的核心数据属性重置