有没有单行方式在Python venv中运行命令?

问题描述 投票:0回答:8

我有一个命令只能在我配置的 Python 虚拟环境中正确运行(按预期)。我知道我可以运行命令

$ cmd args

一旦我激活了 venv。但是(由于我正在使用的工具的限制)我需要在一行中激活运行(并停用?):相当于运行

$ activate_somehow cmd args

在命令行之外。

有办法做到这一点吗?

python command-line-interface virtualenv
8个回答
24
投票

通常,您只需使用脚本的完全限定路径即可在虚拟环境中运行某些内容。 例如,如果我有:

virtualenv .venv

然后我可以将某些东西安装到该虚拟环境中,而无需通过运行激活它:

.venv/bin/pip install foo

对于使用标准 Python 机制安装的任何东西都应该如此。


6
投票

查看生成的

bin/activate
脚本后,似乎与 python 唯一相关的是
VIRTUAL_ENV
变量,所以这应该足以开始:

$ env VIRTUAL_ENV=path/to/venv python ...

请注意,目标环境的

bin
目录中的python可执行文件只是全局安装的解释器的符号链接,它除了设置进程可执行路径之外没有任何作用。假设程序不使用它,那么使用主二进制文件本身似乎是无害的。如果您安装了一个软件包,该软件包又安装了一些可执行文件,只需指定绝对路径:

$ env VIRTUAL_ENV=path/to/venv path/to/venv/bin/executable

4
投票

我发现 venv-run 应该满足你的要求:

pip install venv-run
venv-run cmd args

1
投票

Larsk 的答案可能更清晰,但这是另一种可能的方式。 假设您使用 UNIX 并且您的用户是

user
并且您在主(任何)目录中有一个虚拟环境,即
/home/user/venv
,您可以制作如下脚本:

#!/bin/sh
export VIRTUAL_ENV=/home/user/venv
export PATH=/home/user/venv/bin:$PATH
python3 "$@"

我们可以使这个脚本可执行(例如,将其称为

venv-python3
并执行
chmod +x venv-python3
)并这样调用它,或者将其放在 PATH 中可发现的某个位置 - 比如说与 python 一起。假设您有 sudo 权限:

sudo cp venv-python3 /usr/bin/venv-python3

然后我们可以调用它而不是 python 可调用函数。由于变量是在脚本内设置的,因此退出时不需要显式调用 deactivate。

示例:

user@machine ~ % venv-python3 --help

这至少适用于 virtualenv 版本 20.0.17,但如果采用,您应该密切关注

bin/activate
设置的变量(如果发生变化)。


0
投票

您可以创建一个简单的包装脚本,该脚本运行

activate
,执行您的命令,然后只需退出激活您的环境的脚本即可停用。

#!/bin/sh
. ${venv-./env}/bin/activate
"$@"

这允许您将环境变量

venv
设置为要使用的环境的路径,或者如果未设置则使用
./env
。也许更好的设计是将 env 作为第一个参数传递:

#!/bin/sh
. "$1"/bin/activate
shift
"$@"

无论哪种方式,请将其保存在您的

PATH
中(
$HOME/bin
是私有脚本的常见选择)并授予其可执行权限。


0
投票

您可以在临时子shell中运行它

$ python -m venv .venv
$ (source .venv/bin/activate && python cmd args)

好处:

  • 使用整个虚拟环境,而不仅仅是安装到其中的Python。
  • 执行后你不会留在环境中

-1
投票

是的,您可以在 Windows 上使用虚拟环境在一行命令中执行 python 文件。

venv\Scripts\activate&&python fall_detector.py

-1
投票

我在名为“pgadmin4”的虚拟环境中的主目录中安装了 pgadmin4。

我使用鱼壳,它运行得非常好:

~/pgadmin4/bin/python3 ~/pgadmin4/lib/python3.10/site-packages/pgadmin4/pgAdmin4.py

以防万一这对某人有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.