62

因此,我再次编写了一个不错的 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!?

4

8 回答 8

79

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

也许更好的是,您可以创建一个 shell 脚本(venv-run.sh例如,您可以命名它)来将任何 Python 脚本运行到给定的 virtualenv 中,并将其放置在/usr/bin/usr/local/binPATH.

这样的脚本可能如下所示:

#!/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

于 2011-09-24T13:53:50.630 回答
9

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

ENV=myenv
source $WORKON_HOME/$ENV/bin/activate
于 2012-08-03T08:56:51.623 回答
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 无法按预期运行的问题。

您可以按顺序运行尽可能多的这些。它将打开选项卡,给它们一个别名,然后运行你想要的脚本。

就我个人而言,当我在终端中键入 startdev 时,我将别名放入我的 bashrc 中。

我喜欢这个,因为它简单、易于复制、灵活,并且不需要摆弄变量等等。

于 2020-01-17T20:39:04.283 回答
1

这是一个已知问题。作为一种解决方法,您可以将脚本的内容设置为函数并将其放置~/.bashrc~/.profile

function run-app() {
  workon "$(cat .venv)"
  python main.py
} 
于 2015-06-09T11:40:56.703 回答
0

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

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

并重新打开您的终端并尝试

于 2013-07-02T11:11:10.133 回答
0

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

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

然后从你的 shell 脚本调用:

#!/bin/bash

/path/to/virtualenv/myenv/bin/python myscript.py
于 2013-08-17T16:06:21.623 回答
0

显然,我这样做是错误的。与其将 virtualenv 的名称保存在 .venv 文件中,不如将它放在 virtualenv 的目录路径中。

(cdvirtualenv && pwd) > .venv

在 中bin/run-app,我把

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

耶!

于 2011-09-24T14:20:08.733 回答
0

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

来自 virtualenv 的 main.py bin

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

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

PATH 中的符号链接:

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

在 bin/run-app 中:

#!/bin/sh
# cd into the project directory
pymain arg1 arg2 ...
于 2011-09-24T12:31:23.460 回答