关于python:virtualenvwrapper函数在shell脚本中不可用

virtualenvwrapper functions unavailable in shell scripts

所以,再一次,我做了一个很好的python程序,它使我的生活变得更加简单,节省了很多时间。当然,这涉及到一个virtualenv,由virtualenvwrapper的mkvirtualenv函数生成。该项目有一个requirements.txt文件,其中包含一些必需的库(请求也是:d),如果没有这些库,程序将无法运行。

我正在尝试添加一个bin/run-app可执行shell脚本,该脚本将在我的路径中(实际上是symlink)。现在,在这个脚本中,在运行这个程序之前,我需要切换到virtualenv。所以我把这个放进去了

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

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

当然,我的bashrc中有来自virtualenwrapper.sh的源代码,但在这个shell脚本中似乎没有。

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


在你的脚本中的脚本是为了输入虚拟文档的功能。然后你就可以在脚本中使用workon功能。

也许更好的是,你可以创建一个壳牌脚本(例如,它可以叫EDOCX1〕〔4〕),将任何Python脚本运进一个虚拟的纪念品,并将它放在EDOCX1〔5,EDOCX1〕〔6〕或你的PATH中的任何目录。

这样的脚本可以看起来像这样:

1
2
3
4
5
6
7
#!/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那样简单地使用


我找不到触发壳牌virtualenvwrapper命令的方法。但这是个骗局,可以帮助你Then put following lines at the beginning of scripts:

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


这是个已知的出路作为一个工作场所,你可以把脚本的内容变成一个功能,并将它放在另一个~/.bashrc~/.profile中。

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

你也可以直接叫虚拟PythonFirst find the path to the executable:

1
2
3
$ workon myenv
$ which python
/path/to/virtualenv/myenv/bin/python

然后呼唤你的壳牌脚本:

1
2
3
#!/bin/bash

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

Add these lines to your Bashrcor&U profile.

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

重新打开你的终点站尝试


显然,我的方式是错误的。在Venv档案中存储虚拟V的名称,我应该将虚拟V的目录路径输入。

1
(cdvirtualenv && pwd) > .venv

我把它放在

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

还有耶!


如果你的Python脚本需要一个特殊的虚拟虚拟输入/安装在虚拟如果你需要访问环境之外的脚本,你可以做一个symlink。

Main.py from Virtalenv's bin

1
2
3
4
5
#!/path/to/virtualenv/bin/python
import yourmodule

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

Symlink in your path:

ZZU1

In BIN/Run-App:

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