安装软件包并使用它们运行Python
项目描述
pip-run 提供单次执行运行时临时包安装。
它替换了以下一系列命令(或其Windows等价物)
$ virtualenv --python pythonX.X --system-site-packages $temp/env $ $temp/env/bin/pip install pkg1 pkg2 -r reqs.txt $ $temp/env/bin/python ... $ rm -rf $temp/env
使用以下单行命令
$ py -X.X -m pip-run pkg1 pkg2 -r reqs.txt -- ...
功能包括
下载缺失的依赖项并使其包可用于导入。
将包安装到特殊暂存位置,以便在进程退出后不会安装。
依赖pip来缓存此类包的下载以供重用。
除了pip的缓存文件外,不留下其调用的痕迹。
当需要时,将取代已安装的包。
重新使用pip工具链进行包安装。
pip-run 不旨在解决生产依赖关系管理,但旨在解决围绕依赖关系管理的其他一次性场景
试验和实验
构建设置
测试运行器
即时脚本运行
交互式开发
错误分类
pip-run 是Pip和Virtualenv的补充,旨在更易于满足按需需求。
安装
pip-run 旨在安装在系统站点包中,与pip一起安装,尽管它也可以在virtualenv中安装。
使用方法
作为脚本启动器
作为运行时依赖关系上下文管理器
作为依赖关系上下文中的交互式解释器
作为模块启动器(类似于 python -m)
作为shell的shebang(#!/usr/bin/env pip-run),用于创建单文件Python工具
从命令行使用控制台条目脚本(简单地说就是 pip-run)或使用模块可执行文件(python -m pip-run)来调用 pip-run。后者在测试不同Python版本的命令时尤其方便。
pip-run 后面的参数直接传递给 pip install,所以 pip-run numpy 将安装 numpy(报告安装过程中所做的任何工作),而 pip-run -v -r requirements.txt 将详细安装名为 requirements.txt 的文件中列出的所有依赖项(默认为静默模式)。任何 pip 识别的环境变量 也将被识别。
在 pip install 的参数之后,可以可选地包括一个 --,之后任何参数将由Python解释器在上下文中执行或直接执行(如果以 ! 前缀)。
有关详细信息,请参阅 pip-run --help。
示例
本项目中的 示例文件夹 包含一些示例,展示了该项目的强大功能和实用性。请阅读那些示例的文档以获取说明。
模块脚本运行器
pip-run 最强大的用法之一是能够通过 runpy(也称为 python -m)调用可执行模块和包。
$ pip-run cowsay -- -m cowsay "moove over, pip-run" ------------------- < moove over, pip-run > ------------------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || ||
模块可执行文件运行器
某些包工具,如 ranger,使用独特的可执行文件而不是模块来调用。pip-run 可以在包中运行一个可执行文件,如果它以 ! 前缀。
$ pip-run ranger-fm -- '!ranger'
命令运行器
请注意,在 – 之后的所有内容都将传递给Python调用,因此可以有一个在依赖上下文下运行的单行命令
$ python -m pip-run requests -- -c "import requests; print(requests.get('https://pypi.ac.cn/project/pip-run').status_code)" 200
只要 pip-run 安装在系统上每个Python环境中,就可以通过指定相关解释器轻松地在其他Python环境中重复此命令
$ py -3.7 -m pip-run ...
脚本运行器
pip-run 可以运行具有指示依赖项的Python文件。因为 -- 之后的所有参数都直接传递给Python解释器,并且Python解释器将运行任何脚本,因此调用具有依赖项的脚本很容易。考虑以下脚本“myscript.py”
#!/usr/bin/env python
import requests
req = requests.get('https://pypi.ac.cn/project/pip-run')
print(req.status_code)
要调用它,同时确保 requests 存在
$ pip-run requests – myscript.py
pip-run 将确保安装 requests,然后在配置了 requests 及其依赖项的Python解释器中调用脚本。
为了在运行脚本时提供额外的便利,pip-run 将在遇到存在的Python脚本文件名时推断Python参数的开始,允许在脚本调用时省略 --。
$ pip-run requests myscript.py
脚本声明的依赖项
在脚本运行器的基础上,pip-run 还允许在脚本中声明依赖项,这样用户在每次调用时就不必指定它们。
要在脚本中声明依赖项,请将 __requires__ 变量或 # Requirements: 部分添加到脚本中
#!/usr/bin/env python
__requires__ = ['requests']
# or (PEP 723)
# /// script
# dependencies = ['requests']
# ///
import requests
req = requests.get('https://pypi.ac.cn/project/pip-run')
print(req.status_code)
在放置该声明后,现在可以调用 pip-run,而无需声明任何pip参数
$ pip-run myscript.py 200
要求格式必须遵循 PEP 508。
单脚本工具和Shebang支持
结合脚本中的依赖项,pip-run 可以用作 shebang 以创建完全自包含的脚本,这些脚本可以安装并运行自己的依赖项,只要系统 PATH 上已安装 pip-run。例如,考虑 pydragon 脚本
#!/usr/bin/env pip-run
__requires__ = ['requests', 'beautifulsoup4', 'cowsay']
import requests
from bs4 import BeautifulSoup as BS
import cowsay
res = requests.get('https://www.pythonlang.cn')
b = BS(res.text, 'html.parser')
cowsay.dragon(b.find("div", class_="introduction").get_text())
此可执行脚本作为 examples/pydragon(适用于Unix)和 examples/pydragon.py(适用于Windows [2])存储在仓库中。执行此脚本相当于执行 pip-run pydragon。
默认情况下,脚本将在每次调用时组装依赖项,这可能对脚本来说不方便。请参阅 环境持久性 以了解在调用之间持久化组装的依赖项的技术。可以在 shebang 中注入 PIP_RUN_MODE=persist,但请注意,这样做会破坏 Windows 可移植性。
其他脚本指令
pip-run 还识别全局 __index_url__ 属性。如果存在,此值将为 pip 提供与属性值对应的 --index-url,允许脚本指定自定义包索引
#!/usr/bin/env python
__requires__ = ['my_private_package']
__index_url__ = 'https://my.private.index/'
import my_private_package
...
提取要求
使用 pip-run 运行脚本后,可能希望从脚本的 __requires__ 变量或 # Requirements: 部分提取要求,以更永久地安装它们。pip-run 提供了一种简化此过程的例程
$ py -m pip_run.read-deps examples/pydragon requests beautifulsoup4 cowsay
在 Unix 上,可以将此结果直接通过管道传输到 pip
$ pip install $(py -m pip_run.read-deps examples/pydragon)
要生成 requirements.txt 文件,请指定换行分隔符
$ py -m pip_run.read-deps --separator newline examples/pydragon > requirements.txt
由于 pipenv 使用相同的语法,因此相同的技巧也适用于 pipenv
$ pipenv install $(python -m pip_run.read-deps script.py)
交互式解释器
pip-run 还提供了一种轻松地以某些依赖项的上下文运行 Python 交互式解释器的方法
$ /clean-install/python -m pip-run boto >>> import boto >>>
实验和测试
由于 pip-run 提供了单命令调用,因此非常适合实验和快速测试各种包规范。
考虑一种场景,其中有人希望创建一个环境,在该环境中安装同一包的两个不同版本,例如复制一个破损的真实世界环境。通过堆叠两次 pip-run 调用来安装两个不同的版本
$ pip-run keyring==21.8.0 -- -m pip-run keyring==22.0.0 -- -c "import importlib.metadata, pprint; pprint.pprint([dist._path for dist in importlib.metadata.distributions() if dist.metadata['name'] == 'keyring'])" [PosixPath('/var/folders/03/7l0ffypn50b83bp0bt07xcch00n8zm/T/pip-run-a3xvd267/keyring-22.0.0.dist-info'), PosixPath('/var/folders/03/7l0ffypn50b83bp0bt07xcch00n8zm/T/pip-run-1fdjsgfs/keyring-21.8.0.dist-info')]
IPython 推理
如果指定 IPython 作为依赖项之一,Python 解释器将通过 IPython(使用 -m IPython)启动交互模式。可以通过设置环境变量 PIP_RUN_IPYTHON_MODE=ignore 来关闭此行为。
它是如何工作的
pip-run 实际上执行以下操作
pip install -t $TMPDIR
PYTHONPATH=$TMPDIR python
清理
有关详细信息,请参阅pip_run.run()。
环境持久性
pip-run 遵循 PIP_RUN_RETENTION_STRATEGY 变量。如果未设置或设置为 destroy,则每个调用都会将依赖项安装到临时目录中(并在之后删除)。将此变量设置为 persist 将会创建或重用用户缓存的目录,只有当目录不存在时才会安装依赖项。为每个指定的要求组合维护一个单独的缓存。
persist 策略可以在一定程度上提高启动性能,但会牺牲数据的新鲜度和积累的冗余。
如果没有 PIP_RUN_RETENTION_STRATEGY=persist(或设置为 =destroy),则 pip-run 每次脚本运行时都会重新安装依赖项,在安装依赖项到临时环境的同时,无声地增加了启动时间,这取决于依赖项的数量以及依赖项是否已经下载到本地的 pip 缓存中。使用 pip-run -v ... 查看安装活动。
可以使用此命令查看缓存位置
py -c 'import importlib; print(importlib.import_module("pip_run.retention.persist").paths.user_cache_path)'
限制
由于 pip 的限制,pip-run 不能与“可编辑的”(-e)要求一起运行。
pip-run 使用 sitecustomize 模块确保 requirements 中的 .pth 文件被安装。因此,任何具有 sitecustomize 模块的环境在运行 pip-run 时都会发现该模块被遮挡。
与 pipx 的比较
pipx 项目 是另一个具有相似目标的高级项目。这两个项目都在临时环境中公开项目和其依赖项。主要区别在于 pipx 主要公开来自这些环境的 Python 二进制文件(控制台脚本),而 pip-run 公开 Python 上下文(包括 runpy 脚本)。
特性 |
pip-run |
pipx |
---|---|---|
用户模式操作 |
✓ |
✓ |
调用控制台脚本 |
✓ |
✓ |
调用 runpy 模块 |
✓ |
|
运行独立脚本 |
✓ |
|
带依赖项的交互式解释器 |
✓ |
|
临时环境 |
✓ |
✓ |
持久环境 |
✓ |
✓ |
支持 PEP 582 |
✓ |
|
指定可选依赖项 |
✓ |
|
支持 Python 2 |
✓ |
与 virtualenvwrapper mktmpenv 的比较
virtualenvwrapper 项目 尝试解决 pip-run 解决的一些用例,特别是 mktmpenv 命令,该命令在取消激活后销毁虚拟环境。主要区别在于 pip-run 只在单个命令调用期间是临时的,而 mktmpenv 持续整个会话。
特性 |
pip-run |
mktmpenv |
---|---|---|
创建临时包环境 |
✓ |
✓ |
跨 Python 调用可重用 |
✓ |
✓ |
便携式 |
✓ |
|
单行调用 |
✓ |
|
会话中多个解释器 |
✓ |
|
运行独立脚本 |
✓ |
✓ |
带依赖项的交互式解释器 |
✓ |
✓ |
重用现有环境 |
✓ |
|
临时环境 |
✓ |
✓ |
持久环境 |
✓ |
✓ |
集成
作者创建此包是为了在直接将其集成到 pip run 命令中之前展示其能力。在提出更改后,此想法在 pip 3971 中被广泛拒绝。
如果您想看到此功能在 pip 中可用,请在该票据中点赞或评论。
版本控制
pip-run 使用语义版本控制,因此您可以在接口稳定性方面对库充满信心,即使在变化极大的时期也是如此。
测试
使用 tox 调用测试。
企业版
作为 Tidelift 订阅的一部分提供。
本项目和维护成千上万个其他包的维护者正与 Tidelift 合作,提供一项企业订阅,涵盖您使用的所有开源软件。
项目详情
下载文件
下载您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。