Skip to main content

Python扩展模块的交叉编译工具

项目描述

构建状态 测试状态 覆盖状态

文档可在https://crossenv.readthedocs.iodocs目录中在线获取。

将 Python 应用程序移植到嵌入式设备可能很复杂。一旦为您的系统构建了 Python,您可能会发现自己需要包含许多第三方库。纯 Python 库通常可以正常工作,但许多流行的库依赖于编译的 C 代码,这可能很难构建。

这个包是一个用于交叉编译扩展模块的工具。它创建了一个特殊的虚拟环境,这样pipsetup.py将为您交叉编译包,通常无需您做进一步的工作。

它可用于:

  • 构建二进制轮子,用于安装在目标上。

  • 将软件包安装到目录以供上传或包含在固件映像中。

注意:虽然这个工具可以交叉编译大多数Python 包,但它并不能解决交叉编译的所有问题。在某些情况下,人工干预可能仍然是必要的。

此工具需要 Python 3.5 或更高版本(主机和构建)。在较新的版本中交叉编译 Python 已经进行了大量工作,并且正确执行交叉编译所需的许多技术在旧版本中不可用。

该工具目前仅支持 Linux 构建机器。

词汇

主持人

您正在为其构建的机器。(Android、iOS、其他嵌入式系统。)

建造

您正在构建的机器。(可能是您的桌面。)

主机-python

在主机上运行的已编译 Python 二进制文件和库

构建-python

在 Build 上运行的已编译 Python 二进制文件和库。

跨蟒蛇

Build-python,专门配置为构建可以与 Host-python 一起运行的包。这个工具创建了 Cross-python。

这个怎么运作

Cross-python 是经过仔细设置的,因此它完全按照 Host-python 的方式报告所有系统信息。如果正确完成,这样做的副作用是distutilssetuptools将在构建包时交叉编译。所有正常的打包机制仍然可以正常工作,因此依赖项、ABI 标签等都可以按预期工作。

要求

你会需要:

  1. 在 Build 上运行的 Python 版本(3.5 或更高版本)。(构建-python。)

  2. 将在主机上运行的 Python 版本。(Host-python.) 这必须 与 Build-python的版本相同。

  3. 用于制作 Host-python 的交叉编译工具链。确保正确设置 PATH 以使用它。

  4. 你的模块所依赖的任何库,交叉编译和安装在 Cross-python 可以访问的地方。例如,密码学 包依赖于 OpenSSL 和 libffi。

安装

可以使用 pip 安装 Crossenv:

$ pip install crossenv

用法

创建虚拟环境:

$ /path/to/build/python3 -m crossenv /path/to/host/python3 venv

这将创建一个名为venv的文件夹,其中包含两个从属虚拟环境:一个用于 Build-python,一个用于 Cross-python。激活后, python(或其别名cross-python)可用于交叉编译。如果需要,可以使用build-python在 Build 上安装包(例如,需要安装 Cython 的包)。有等效的pipcross-pipbuild-pip命令。

要使用的交叉编译器以及所需的任何额外标志均取自编译 Host-python 时记录的信息。激活环境:

$ . venv/bin/activate

您现在可以看到python似乎认为它正在主机上运行:

(cross) $ python -m sysconfig
...

现在你可以交叉编译了!要将包安装到 venv/cross/lib/python3.6/site-packages,可以直接使用 pip :

(cross) $ pip -v install numpy
...

您可以使用setup.py来构建轮子:

(cross) $ pip install wheel
(cross) $ pip download numpy
Collecting numpy
  Using cached numpy-1.14.1.zip
  Saved ./numpy-1.14.1.zip
Successfully downloaded numpy
(cross) $ unzip -q ./numpy-1.14.1.zip
(cross) $ cd numpy-1.14.1
(cross) $ python setup.py bdist_wheel
...

当您需要安装 Cython 或 cffi 等软件包来构建另一个模块时,有时满足依赖关系可能会变得很棘手。如果您只是简单地pip install 模块,您可能会发现它构建 Cython 作为主机的先决条件,然后尝试在构建机器上运行它。这当然会失败,但是如果我们为build-python安装必要的包,那么pip将在安装过程中选择正确的版本。

例如,要构建 bcrypt 和 python-cryptography:

(cross) $ build-pip install cffi
(cross) $ pip install bcrypt
(cross) $ pip install cryptography

一些包会明确检查包的存在。例如,一个包可能会在继续安装之前检查 Cython(而不是简单地尝试导入它)。如果一个包是用 build-pip等方式安装的,那么cross-python中的 setuptools不会将其识别为已安装。(请注意,即使 setuptools 看不到它,您仍然可以导入它,因此只要您之前 执行build-pip install Cython ,导入 Cython的幼稚检查就可以正常工作。)这是设计使然。要选择性地公开 build-python 包以便 setuptools 将它们计为已安装,您可以使用安装在虚拟环境中的交叉公开脚本。

已知限制

  • 升级crosspipbuild-pip必须小心谨慎,除非需要,否则最好不要这样做。如果您需要:先升级cross-pip ,然后再升级build-pip

  • 安装脚本时,shebang ( #! ) 行是错误的。这需要在主机上使用之前修复。

  • 在构建过程中使用的任何依赖库,例如 OpenSSL,都不会 打包在 wheel 或 install 目录中。您需要确保这些库已安装在主机上并且可以使用。这是正常的 Python 行为。

  • setup.py中的setup_requires中列出的任何设置时间要求 都将安装在 Cross-python 的虚拟环境中,而不是 Build-python 中。如果它们是纯 Python 的话,这无论如何都会起作用,但是对于带有扩展模块(Cython 等)的包,您需要先将它们安装到 Build-python 的环境中。在 pip install <whatever>之前执行build-pip install <whatever >通常是个好主意 。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

crossenv-1.3.0.tar.gz (27.2 kB 查看哈希)

已上传 source

内置分布

crossenv-1.3.0-py3-none-any.whl (28.9 kB 查看哈希

已上传 py3