跳转到主要内容

安装软件包并使用它们运行Python

项目描述

https://img.shields.io/pypi/v/pip-run.svg https://img.shields.io/pypi/pyversions/pip-run.svg tests Ruff https://readthedocs.org/projects/pip-run/badge/?version=latest https://img.shields.io/badge/skeleton-2024-informational https://tidelift.com/badges/package/pypi/pip-run

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 |
           ||     ||
cowsay example animation

模块可执行文件运行器

某些包工具,如 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 合作,提供一项企业订阅,涵盖您使用的所有开源软件。

了解更多信息.

项目详情


发布历史 发布通知 | RSS 源

下载文件

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

源分发

pip_run-13.0.0.tar.gz (38.9 kB 查看哈希值)

上传时间

构建分发

pip_run-13.0.0-py3-none-any.whl (18.7 kB 查看哈希值)

上传时间 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面