【问题标题】:Import and use standard Python module from inside Python C extension从 Python C 扩展中导入和使用标准 Python 模块
【发布时间】:2012-02-11 04:39:15
【问题描述】:

我有用 C 编写的 Python 扩展模块。我想在这个 C 代码中使用标准 Python 模块之一,例如 osshutil。如何最好地做到这一点?

【问题讨论】:

    标签: python c python-c-api python-extensions


    【解决方案1】:
    PyObject* os = PyImport_ImportModuleNoBlock("os");
    if (os == NULL)
      return NULL;
    someattr = PyObject_GetAttrString(os, "someattr");
    Py_DECREF(os);
    

    如果您只导入一次模块,例如在init_yourmodule() 函数中,则使用PyImport_ImportModule("os")

    【讨论】:

    • 函数PyImport_ImportModuleNoBlock现在是deprecated
    • @user 是的。现在这两个功能是一样的。
    【解决方案2】:

    不要。

    改为更改您的扩展模块,使其为 Python 提供服务,然后编写调用 osshutil 和您的模块的 Python 代码。

    事实上,对于os 模块中的很多内容,编写本机C 代码可能比调用Python 更好。

    当然,you can call Python modules from C code,只是这样做对于像osshutil 这样的低级模块来说太过分了。对于shutil 中的文件复制方法,在您的 C 代码中重新实现它们是微不足道的。事实上,在 Windows 上,复制文件是通过调用操作系统来完成的,因此甚至用 C 编写的代码也不多。

    如果 Python 模块是用 C 编写的,您甚至可以只复制所需方法的代码。

    【讨论】:

    • 复杂的扩展模块有时需要做一些已经在标准库中实现的东西。在 C 中重新实现它们,或者重构代码是一种耻辱
    猜你喜欢
    • 1970-01-01
    • 2011-03-31
    • 2020-11-13
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多