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

标签 python software-distribution

我写了一个 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/

相关文章:

python - Django 文件字段更新导致错误,即使不是必需的

Android:当付费 Google Play 在我的国家不可用时如何分发付费应用程序

deployment - 使用 docker-compose 站起来选择服务

python - SQLAlchemy:禁用延迟加载并仅在 join() 上加载对象

python - 分发使用自定义 c 模块扩展的 python 程序的最佳方法是什么?

apache-flex - 如何限制我的 AIR 分发?

ipad - iOS : Install iPad App wirelessly doesn't work

python - Python 列表创建的性能

python - 从字典中使用replace()时出现类型错误

python - 数据必须像查询集一样