Python 在shell脚本中无法使用VirtualEnvrapper函数

Python 在shell脚本中无法使用VirtualEnvrapper函数,python,bash,virtualenv,virtualenvwrapper,Python,Bash,Virtualenv,Virtualenvwrapper,所以,再一次,我制作了一个很好的python程序,它让我的生活变得更加轻松,节省了很多时间。当然,这涉及到一个virtualenv,它是用virtualenvwrapper的mkvirtualenv函数制作的。该项目有一个requirements.txt文件,其中包含一些必需的库(requests-too:D),如果没有这些库,程序将无法运行 我正在尝试添加一个bin/runapp可执行shell脚本,该脚本将位于我的路径中(实际上是symlink)。现在,在这个脚本中,我需要切换到virtua

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

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

#!/bin/bash
# cd into the project directory
workon "$(cat .venv)"
python main.py
一个文件
.venv
包含virtualenv名称。但是当我运行这个脚本时,我得到
workon:command not found
错误

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


那么,我如何访问这些VirtualVWrapper函数呢?还是我做得不对?如何启动python工具,每个工具都有自己的virtualenv

如果您的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应用程序中:

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

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

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

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

#!/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那样使用

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

(cdvirtualenv && pwd) > .venv
bin/run应用程序中,我将

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

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

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

将这些行添加到.bashrc或.bash_配置文件中

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

然后重新打开终端并尝试

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

$ 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
} 

这是一个超级旧线程,我有一个类似的问题。出于好奇,我开始寻找更简单的解决方案

gnome-terminal --working-directory='/home/exact/path/here' --tab --title="API" -- bash -ci "workon aaapi && python manage.py runserver 8001; exec bash;"
默认情况下,--workingdirectory强制选项卡在引擎盖下打开,-ci强制它像一个交互界面一样工作,从而解决了VenvRapper无法正常工作的问题

您可以按顺序运行其中的任意多个。它将打开选项卡,给它们一个别名,然后运行所需的脚本

就我个人而言,当我在终端中键入startdev时,我在bashrc中输入了一个别名来执行此操作


我喜欢它,因为它简单、易于复制、灵活,而且不需要任何变量之类的东西

这是可行的,但我不喜欢将通往virtualenv python的路径放在#中!线,感觉有点脏。另外,在virtualenv中创建main.py的这一额外步骤使它的可移植性降低。我的朋友们不能从我这里克隆并运行它:)@Shrikant Sharat:如果你编写simple setup.py,那么
pip install
可以为你提供shebang和复制到virtualenv/bin。你的朋友可以:
pip安装git+…
,如果他们喜欢前沿。注意,在本例中,
main.py
被复制到他们的virtualenv,而shebang被写入指向他们的virtualenv/python。@Sebastian,从未考虑过这个选项,但听起来不错。您推荐的任何好的文档阅读(除了我现在正在查看的python文档),如果有的话。谢谢@Shrikant Sharat:例如,这需要对virtualenvwrapper.sh脚本的位置进行硬编码,这取决于操作系统,以及其他许多因素。@ShrikantSharat好的,因为这是一种让您在virtualenv中运行脚本更简单的方法(因此仅在您的系统上),这应该不是一个问题,是吗?如果你想发布你的代码,我怀疑你是否会要求用户安装virtualenv并创建一个,你只需给他一个要安装的依赖项列表。这些用户将是我的技术朋友,他们也希望该程序的依赖项使用virtualenv。我不需要让他们这么做;)@ShrikantSharat硬编码如果
virtualenvwrapper.sh
在您的路径中,则不需要对路径进行硬编码,例如,当它安装了
pip
(我相应地更新了我的答案)@MatToufoutu,不幸的是,其中有一个假设。有些系统安装virtualenvwrapper非常“聪明”:将它放在
/etc/bash_completion.d/virtualenvwrapper
中,它既不在路径上,也没有完全相同的名称:(强制您将它符号链接到此类系统上的某个位置。