【问题标题】:cython setuptools change output filenamecython setuptools 更改输出文件名
【发布时间】:2020-01-15 12:10:12
【问题描述】:

我正在使用 cython 交叉编译外部 python 模块。我在主机上使用python3.6,在目标上使用python3.5。我也在 x86_64 上为目标 aarch64 编译。

我的 setup.py 看起来像:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
from Cython.Distutils import build_ext
import builder_config
import os

os.environ["PATH"] = builder_config.PATH
os.environ["CC"] = builder_config.COMPILER
os.environ["LDSHARED"] = builder_config.COMPILER + " -lpython3.5m -shared"
os.environ["CFLAGS"] = builder_config.CFLAGS
os.environ["LDFLAGS"] = builder_config.LDFLAGS
os.environ["ARCH"] = "aarch64"

setup(
    ext_modules = cythonize((Extension("my_ext", ["file1.pyx", "file2.pyx", "file3.pyx", "file4.pyx", "file5.pyx"]))),
)

当我运行python3.6 setup.py build_ext -i 时,我得到一个名为:my_ext.cpython-36m-x86_64-linux-gnu.so 的文件

我的问题是,除非将名称更改为,否则不会在目标上加载库:

my_ext.cpython-35m-aarch64-linux-gnu.so

如何更改生成的文件名?

【问题讨论】:

  • 您尝试做的事情并不安全;实际使用 Python 3.6 编译很可能会依赖 Python 3.5 中不存在的特性。只需更改名称即可尝试导入它,但它可能会以某种方式被破坏。除非您使用 stable ABI(而且 Cython 肯定不会),否则您不能为 Python 的 any 次要版本编译并期望相同的二进制文件在不同的次要版本上工作。

标签: python setuptools distutils


【解决方案1】:

如 cmets 中所述,您尝试实现的目标是不安全的。

您可以使用环境变量 _PYTHON_HOST_PLATFORM 解决架构标签(例如,您可以在 sitecustomize.py 中更改它)。但是,如果这些模块实际上是不兼容的(而且很可能是),那么您以后只会得到核心转储。

我认为您无法解决主要的 Python 版本。

为了回到更安全的地方,我会尝试依赖便携式解决方案。例如,它看起来并不正式,但我们可以在网上找到一些关于 Conda 和 aarch64 的文章(例如,您可以查找“Archiconda”)。还有一次,您不能简单地将 conda 环境从一台机器复制到另一台机器,但是,您可以冻结这些环境(通过“conda 导出”)并在目标机器上构建类似的环境。

【讨论】:

    【解决方案2】:

    如果可能,您可以选择将目标解释器升级到 v3.6。

    另一种选择是在您使用该解释器构建的机器上安装 v3.5。在同一台机器上安装多个不同版本的 python 解释器非常简单。我不知道你的具体情况,所以我不能提供任何链接,但我相信快速搜索会得到你需要的东西。

    【讨论】:

      猜你喜欢
      • 2017-12-22
      • 2016-11-26
      • 1970-01-01
      • 1970-01-01
      • 2016-10-24
      • 1970-01-01
      • 2012-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多