我有一个命令只能在我配置的 Python 虚拟环境中正确运行(按预期)。我知道我可以运行命令
$ cmd args
一旦我激活了 venv。但是(由于我正在使用的工具的限制)我需要在一行中激活运行(并停用?):相当于运行
$ activate_somehow cmd args
在命令行之外。
有办法做到这一点吗?
通常,您只需使用脚本的完全限定路径即可在虚拟环境中运行某些内容。 例如,如果我有:
virtualenv .venv
然后我可以将某些东西安装到该虚拟环境中,而无需通过运行激活它:
.venv/bin/pip install foo
对于使用标准 Python 机制安装的任何东西都应该如此。
查看生成的
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
我发现 venv-run 应该满足你的要求:
pip install venv-run
venv-run cmd args
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
设置的变量(如果发生变化)。
您可以创建一个简单的包装脚本,该脚本运行
activate
,执行您的命令,然后只需退出激活您的环境的脚本即可停用。
#!/bin/sh
. ${venv-./env}/bin/activate
"$@"
这允许您将环境变量
venv
设置为要使用的环境的路径,或者如果未设置则使用 ./env
。也许更好的设计是将 env 作为第一个参数传递:
#!/bin/sh
. "$1"/bin/activate
shift
"$@"
无论哪种方式,请将其保存在您的
PATH
中($HOME/bin
是私有脚本的常见选择)并授予其可执行权限。
您可以在临时子shell中运行它
$ python -m venv .venv
$ (source .venv/bin/activate && python cmd args)
好处:
是的,您可以在 Windows 上使用虚拟环境在一行命令中执行 python 文件。
venv\Scripts\activate&&python fall_detector.py
我在名为“pgadmin4”的虚拟环境中的主目录中安装了 pgadmin4。
我使用鱼壳,它运行得非常好:
~/pgadmin4/bin/python3 ~/pgadmin4/lib/python3.10/site-packages/pgadmin4/pgAdmin4.py
以防万一这对某人有帮助。