PEX
.. image:: https://github.com/pex-tool/pex/actions/workflows/ci.yml/badge.svg?branch=main :target: https://github.com/pex-tool/pex/actions?query=branch%3Amain+workflow%3ACI
.. image:: https://img.shields.io/pypi/l/pex.svg :target: https://pypi.org/project/pex/
.. image:: https://img.shields.io/pypi/v/pex.svg :target: https://pypi.org/project/pex/
.. image:: https://img.shields.io/pypi/pyversions/pex.svg :target: https://pypi.org/project/pex/
.. image:: https://img.shields.io/pypi/wheel/pex.svg :target: https://pypi.org/project/pex/#files
.. image:: https://img.shields.io/discord/1205942638763573358 :target: https://pex-tool.org/discord
.. contents:: 目录
概述
pex 是一个用于生成 .pex(Python EXecutable)文件的库,这些文件是
virtualenvs <https://virtualenv.pypa.io>_ 精神下的可执行 Python 环境。
pex 是对
PEP 441 <https://peps.python.org/pep-0441/>_
中概述的理念的扩展,
并使 Python 应用程序的部署变得像 cp 一样简单。pex 文件甚至可以
包含多个特定平台的 Python 发行版,这意味着单个 pex 文件
可以在 Linux 和 OS X 之间移植。
pex 文件可以使用 pex tool. Build systems such as Pants <http://pantsbuild.org/>, Buck <http://facebook.github.io/buck/>, and {py}gradle <https://github.com/linkedin/pygradle>_ 构建,
也
支持直接构建 .pex 文件。
仍然不确定 pex 做什么或它是如何工作的?观看这个简短的闪电
演讲:WTF is PEX? <https://www.youtube.com/watch?v=NmpnGhRwsu0>_。
pex 采用 Apache2 许可证授权。
安装
要安装 pex,只需
.. code-block:: bash
$ pip install pex
你也可以在 git 克隆中使用 uv 来构建 pex:
.. code-block:: bash
$ uv run dev-cmd package
$ cp dist/pex ~/bin
这会在 dist/pex that can be copied onto your `` 中构建一个 pex 二进制文件。
这种方法的优势在于,它使你的 Python 环境尽可能保持空状态,
并且更符合 pex 的哲学理念。
简单示例
在环境中使用 requests, flask and psutil 启动一个解释器:
.. code-block:: bash
$ pex requests flask 'psutil>2,<3'
从 Pip 保存依赖项
或者,通过 requirements.txt 冻结当前的虚拟环境,并在任何地方执行它:
.. code-block:: bash
$ pex $(pip freeze) -o my_virtualenv.pex
$ deactivate
$ ./my_virtualenv.pex
临时环境
~~~~~~~~~~~~~~~~~~~~~~
Run webserver.py in an environment containing ``flask`` as a quick way to experiment:
.. code-block:: bash
$ pex flask -- webserver.py
Launch Sphinx in an ephemeral pex environment using the Sphinx entry point ``sphinx:main``:
.. code-block:: bash
$ pex sphinx -e sphinx:main -- --help
Using Entry Points
~~~~~~~~~~~~~~~~~~
Projects specifying a ``console_scripts`` entry point in their configuration
can build standalone executables for those entry points.
To build a standalone ``pex-tools-executable.pex`` binary that runs the
``pex-tools`` console script found in all pex version ``2.1.35`` and newer distributions:
.. code-block:: bash
$ pex "pex>=2.1.35" --console-script pex-tools --output-file pex-tools-executable.pex
Specifying A Specific Interpreter
你还可以构建使用特定解释器类型的 pex 文件:
.. code-block:: bash
$ pex "pex>=2.1.35" -c pex-tools --python=pypy -o pex-tools-pypy-executable.pex
大多数 pex 选项可以很好地组合使用,因此上述命令可以 混合搭配,并且提供了等效的短选项。
要查看完整的选项列表,只需输入 pex --help。
文档
有关 Pex、构建 .pex 文件以及 .pex 文件工作原理的更多文档 可在 https://docs.pex-tool.org 上找到。
开发
Pex 使用 uv <https://docs.astral.sh/uv/>_ 配合 dev-cmd <https://pypi.org/project/dev-cmd/>_ 进行
测试和开发自动化。安装 uv 后,要运行 Pex 测试套件,只需
通过 uv 运行 dev-cmd:
.. code-block:: bash
$ uv run dev-cmd
dev-cmd 命令运行器提供了许多有用的选项,详见
https://pypi.org/project/dev-cmd/ 。下面,我们提供了在
开发 Pex 时最常用的部分命令,但熟悉文档有助于更好地理解 dev-cmd
的工作方式以及如何执行更高级的工作流。
要运行特定命令,请通过运行
uv run dev-cmd --list 来确定要调用的命令名称,然后按名称调用该命令,如下所示:
.. code-block::
$ uv run dev-cmd format
这需要输入不少内容。建议使用 shell 别名,标准别名是 uvrc,
我将在后续内容中使用该别名。
要运行 MyPy:
.. code-block::
$ uvrc typecheck
我们所有的测试都允许向 pytest 传递参数,这有助于运行特定
测试:
.. code-block::
$ uvrc test-py37-integration -- -k test_reproducible_build
要从源码运行 Pex,而不是通过 PATH 中的版本,请通过 Python 调用:
.. code-block::
$ python -m pex