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的函数。 然后,您应该能够在脚本中使用workon
function。
也许更好,你可以创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 }