virtualenvwrapper函数在shell脚本中不可用

所以,再一次,我做了一个不错的Python程序,使我的生活变得更加容易,并节省了大量的时间。 当然,这涉及一个virtualenv,用virtualenvwrapper的mkvirtualenv函数制作而成。 该项目有一个requirements.txt文件与几个所需的库(请求太:D)和程序将不运行没有这些库。

我正在尝试添加一个bin/run-app可执行的shell脚本,它将在我的path中(实际上是符号链接)。 现在,在这个脚本里面,我需要切换到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!

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

也许更好,你可以创build一个shell脚本(例如你可以命名为venv-run.sh )来运行任何Python脚本到一个给定的virtualenv中,并把它放在/usr/bin/usr/local/bin或者PATH任何目录。

这样的脚本可能是这样的:

 #!/bin/sh # if virtualenvwrapper.sh is in your PATH (ie 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一样venv-run.sh my_virtualenv /path/to/script.py

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

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

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

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

并重新打开你的terminal并尝试

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

来自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 ... 

显然,我这样做是错误的。 而不是在.venv文件中保存virtualenv的名字,我应该把virtualenv的目录path。

 (cdvirtualenv && pwd) > .venv 

并在bin/run-app放入

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

耶!

你也可以直接调用virtualenv的python可执行文件。 首先find可执行文件的path:

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

然后从你的shell脚本中调用:

 #!/bin/bash /path/to/virtualenv/myenv/bin/python myscript.py 

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

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