shell脚本中无法使用virtualenvwrapper函数

64 投票
8 回答
29805 浏览
提问于 2025-04-17 02:59

我又写了一个很不错的Python程序,让我的生活变得更轻松,节省了很多时间。当然,这个程序需要用到一个虚拟环境,这个虚拟环境是通过mkvirtualenv这个函数创建的,属于virtualenvwrapper工具。这个项目里有一个requirements.txt文件,里面列出了几个必需的库(包括requests :D),没有这些库程序是无法运行的。

我想添加一个bin/run-app的可执行脚本,这个脚本会在我的路径中(实际上是一个符号链接)。在这个脚本里,我需要先切换到虚拟环境,然后才能运行这个程序。所以我在脚本里加了这个内容:

#!/bin/bash
# cd into the project directory
workon "$(cat .venv)"
python main.py

有一个.venv文件,里面存储了虚拟环境的名称。但是当我运行这个脚本时,出现了workon: command not found的错误。

当然,我在我的bashrc文件里已经引入了virtualenvwrapper.sh,但在这个脚本里似乎无法使用。

那么,我该如何在这里访问这些virtualenvwrapper的功能呢?还是说我这样做不对?你们是怎么启动各自有虚拟环境的Python工具的呢?

8 个回答

2

这是一个很久以前的讨论,我也遇到过类似的问题。出于好奇,我开始寻找一个更简单的解决办法。

gnome-terminal --working-directory='/home/exact/path/here' --tab --title="API" -- bash -ci "workon aaapi && python manage.py runserver 8001; exec bash;"

这里的 --workingdirectory 选项让标签页默认在指定的目录下打开,而 -ci 选项则让它像一个互动界面一样工作,这样就能解决 venvwrapper 不按预期工作的那些问题。

你可以连续运行很多这样的命令。它会打开标签页,给它们起别名,并运行你想要的脚本。

我个人在我的 bashrc 文件里加了一个别名,这样当我在终端输入 startdev 时,就能直接执行这个操作。

我喜欢这样做,因为简单易行,容易复制,灵活,而且不需要调整什么变量之类的。

9

我找不到在命令行中触发 virtualenvwrapper 命令的方法。不过,有一个小技巧可以帮你:假设你的环境名字叫 myenv,那么在脚本的开头加上以下几行:

ENV=myenv
source $WORKON_HOME/$ENV/bin/activate
81

只需要在你的脚本中引入 virtualenvwrapper.sh 这个脚本,就可以使用虚拟环境管理工具的功能了。这样你就可以在脚本中使用 workon 这个功能。

更简单的方法是,你可以创建一个 shell 脚本(比如可以叫它 venv-run.sh),用来在指定的虚拟环境中运行任何 Python 脚本,然后把它放在 /usr/bin/usr/local/bin,或者任何在你的 PATH 里的目录下。

这个脚本可能长这样:

#!/bin/sh
# if virtualenvwrapper.sh is in your PATH (i.e. installed with pip)
source `which virtualenvwrapper.sh`
#source /path/to/virtualenvwrapper.sh # if it's not in your PATH
workon $1
python $2
deactivate

然后你可以简单地用 venv-run.sh my_virtualenv /path/to/script.py 来使用它。

撰写回答