我正在使用cython交叉编译外部python模块。我在主机上使用python3.6,在目标上使用python3.5。我也在目标aarch64的x86_64上编译。
我的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_HOST_PLATFORM解决体系结构标记(例如,可以在sitecustomize.py中对其进行更改)。但是,如果模块实际上是不兼容的(并且很可能是不兼容的),则稍后只会得到核心转储。
我认为您无法解决主要的Python版本。
为了回到更安全的理由,我将尝试依靠便携式解决方案。例如,它看起来并不正式,但是我们可以在网上找到一些有关Conda和aarch64的文章(例如,您可以查找“ Archiconda”)。再过一次,您将无法简单地将conda环境从一台计算机复制到另一台计算机,但是,您可以冻结这些环境(通过“ conda导出”)并在目标计算机上构建类似的环境。