gpt4 book ai didi

python - 如何创建 Python 模块分发以优雅地回退到纯 Python 代码

转载 作者:太空狗 更新时间:2023-10-29 21:44:44 24 4
gpt4 key购买 nike

我写了一个 Python 模块,我有两个版本:纯 Python 实现和 C 扩展。我编写了 __init__.py 文件,以便它尝试导入 C 扩展,如果失败,它会导入纯 Python 代码(这合理吗?)。

现在,我想知道分发此模块的最佳方式是什么(例如编写 setup.py),以便有或没有构 build 施的人都可以轻松使用它,或使用 C 扩展,只需运行:

python setup.py install

我的经验有限,但我看到了两种可能的情况:

  • 用户没有在他们的机器上安装 MS Visual Studio 或 GCC 编译器套件来构建 C 扩展
  • 用户正在运行 IronPython、Jython 或 CPython 以外的任何软件。我只用过 CPython。因此,我不确定如何分发此模块,以便在这些平台无法使用 C 扩展的情况下,它可以顺利运行并易于安装。

最佳答案

(is that reasonable?).

是的,非常明智。

要捕获“没有合适的 C 编译器情况”:调用 setup(...) 将在出现问题时执行 sys.exit。因此,首先在 try 中根据需要设置 ext_modules 参数:

try:
setup(..., ext_modules=...)
except SystemExit: ...

并且在 except 子句中,再次调用 setup(...) 没有 ext_modules(所以它放弃构建和安装扩展)。正在安装的用户仍然会看到诸如“无法执行 gcc-4.0:没有这样的文件或目录”之类的消息,但是您可以适本地添加自己的消息以告知用户这没什么大不了的,并且您正在重试没有扩展模块。

为了支持非 CPython 实现,您可以在 setup.py 中测试 sys.version(我不确定每个非 CPython 的值是多少) CPython 实现,但 IronPython 有一个 'IronPython' 子字符串,例如,以避免尝试 ext_modules 部分。如果您在检查中错过了一些这样的实现,那么 try/except 应该可以捕捉到大多数其他实现,只是有少量的浪费工作;-)。

关于python - 如何创建 Python 模块分发以优雅地回退到纯 Python 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2398699/

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