virtualenvwrapper函数在shell脚本中不可用

时间:2011-09-24 11:06:41

标签: python bash virtualenv virtualenvwrapper

所以,再一次,我做了一个很好的python程序,让我的生活变得更轻松,节省了大量的时间。当然,这涉及到virtualenv,用virtualenvwrapper的mkvirtualenv函数制作。该项目有一个requirements.txt文件,其中包含一些必需的库(请求也是:D),如果没有这些库,程序将无法运行。

我正在尝试添加一个bin/run-app可执行shell脚本,它将在我的路径中(实际上是符号链接)。现在,在这个脚本里面,我需要切换到virtualenv才能运行这个程序。所以我把它放在

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

文件.venv包含virtualenv名称。但是当我运行这个脚本时,我得到workon: command not found错误。

当然,我在我的bashrc中提供了virtualenvwrapper.sh,但它在这个shell脚本中似乎没有。

那么,我如何在这里访问这些virtualenvwrapper函数?或者我这样做是错误的吗?你如何启动你的python工具,每个工具都有自己的virtualenv!?

8 个答案:

答案 0 :(得分:67)

只需在脚本中找到virtualenvwrapper.sh脚本,即可导入virtualenvwrapper的函数。然后,您应该能够在脚本中使用workon函数。

也许更好,您可以创建一个shell脚本(例如,您可以将其命名为venv-run.sh)以将任何Python脚本运行到给定的virtualenv中,并将其放在/usr/bin,{{1}中},或/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

一样使用

答案 1 :(得分:7)

我找不到在shell中触发virtualenvwrapper命令的方法。但这个技巧可以帮助:假设你的环境。 name为myenv,然后在脚本开头放置以下行:

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

答案 2 :(得分:1)

这是一个known issue。要解决此问题,您可以将脚本的内容设为一个函数,并将其放在~/.bashrc~/.profile

function run-app() {
  workon "$(cat .venv)"
  python main.py
} 

答案 3 :(得分:1)

这是一个超级旧线程,我遇到了类似的问题。我出于好奇开始研究一种更简单的解决方案。

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

--working目录强制默认情况下在选项卡下打开该选项卡,而-ci强制该选项卡像交互界面一样工作,从而解决了venvwrapper无法正常工作的问题。

您可以依次运行其中的许多项。它将打开选项卡,为它们提供别名,然后运行所需的脚本。

当我在终端中键入startdev时,我个人将别名放入bashrc中以便执行此操作。

我之所以喜欢它,是因为它简单,易于复制,灵活,并且不需要摆弄任何变量。

答案 4 :(得分:0)

如果您的Python脚本需要特定的virtualenv,那么将其安装/存放在virtualenv的bin目录中。如果您需要在环境之外访问该脚本,那么您可以创建符号链接。

来自virtualenv的bin

main.py:

#!/path/to/virtualenv/bin/python
import yourmodule

if __name__=="__main__":
   yourmodule.main()

路径中的符号链接:

pymain -> /path/to/virtualenv/bin/main.py

在bin / run-app中:

#!/bin/sh
# cd into the project directory
pymain arg1 arg2 ...

答案 5 :(得分:0)

显然,我这样做是错误的。我不应该在.venv文件中保存virtualenv的名称,而应该使用virtualenv的目录路径。

(cdvirtualenv && pwd) > .venv

bin/run-app,我把

source "$(cat .venv)/bin/activate"
python main.py

而且是的!

答案 6 :(得分:0)

将这些行添加到.bashrc或.bash_profile

export WORKON_HOME=~/Envs
source /usr/local/bin/virtualenvwrapper.sh

然后重新打开终端并尝试

答案 7 :(得分:0)

您也可以直接调用virtualenv的python可执行文件。首先找到可执行文件的路径:

$ workon myenv
$ which python
/path/to/virtualenv/myenv/bin/python

然后从shell脚本调用:

#!/bin/bash

/path/to/virtualenv/myenv/bin/python myscript.py