如何从bash脚本中停用virtualenv

edk*_*lel 9 python virtualenv

我是shell脚本的新手,但我想制作一个bash脚本,用于使用virtualenv激活/停用虚拟环境.然后我想像Ubuntu中的服务一样使用这个脚本将其复制到/etc/init.d文件夹中.

在我的脚本中,我有一个这样的变量: VENV=/opt/odoo/odoo_server/venv_oddo/bin

此变量表示虚拟环境中的bin路径.

在脚本中,我可以使用以下语句激活虚拟环境: . ${VENV}/activate

这是可能的,因为activate是虚拟环境中bin目录内的文件.

但我不知道在我的脚本中使用的语句来停用我的虚拟环境.我不能这样做:. ${VENV}/deactivate

问题是不存在名为deactivate的文件,但是取消激活是虚拟环境中bin/activate文件中的一个函数.

let*_*bee 7

只是deactivate.只要你使用bash,它就可以在脚本和命令行中运行.

编辑:在大多数情况下,最好在脚本和服务中拼写完整的python路径.它是无状态的,更便携,几乎无处不在.所以不要这样做

. $VENV/bin/activate
/path/to/my/script.py --parameters
Run Code Online (Sandbox Code Playgroud)

通常最好这样做

$VENV/bin/python /path/to/my/script --parameters
Run Code Online (Sandbox Code Playgroud)

相信我,它会节省你的调试时间)

  • 感谢您的回答,但是如果我在bash脚本中使用`deactivate`,则在执行该脚本时,我会在shell中收到以下消息:`deactivate:not found command` (3认同)
  • 如果没有首先获取定义此函数的脚本,则不能在shell脚本中使用`deactivate`.请参阅我在这个问题上的单独答案. (2认同)

das*_*s-g 6

很难让这样的服务变得有用。

. ${VENV}/activate # note the dot
Run Code Online (Sandbox Code Playgroud)

或者

source ${VENV}/activate
Run Code Online (Sandbox Code Playgroud)

activate脚本,即运行它的内容,好像他们是在那里你采购他们的壳或脚本的一部分virtualenvironment'sactivate 专为这种用途而设计。相反,只需正常执行脚本

${VENV}/activate # note: NO dot and NO 'source' command
Run Code Online (Sandbox Code Playgroud)

将在子shell中运行其内容,不会产生任何有用的效果。

但是,您的服务脚本已经在它自己的子 shell 中运行了。因此,除了作为服务启动过程的一部分运行的任何 python 命令外,它不会产生任何影响。

从好的方面来说,您甚至不必关心停用环境,除非您想在服务启动过程中运行更多 python 内容,但在您的 virtualenv 之外。

  • 我已经编辑了我的答案。@edkalel,现在更容易理解了吗?关键点是“activate”仅影响其来源的 shell/脚本,而不影响整个系统。 (2认同)
  • 谢谢你的解释。我想我已经明白了。然后,如果我在 bash 脚本中使用“activate”(使用 . 或 source),虚拟环境将仅在脚本内部激活,而不是在 shell 外部激活。 (2认同)

And*_*ier 6

deactivate由提供的“命令”virtualenvwrapper实际上是一个 shell 函数,对于workon. 如果您有一个处于活动状态的虚拟环境,您可以使用typeset -F.

为了在脚本中使用它们,需要在那里定义它们,因为 shell 函数不会传播到子 shell。

要定义这些函数,请virtualenvwrapper.sh在要调用这些函数的 shell 脚本中获取脚本,例如:

source $(which virtualenvwrapper.sh)
Run Code Online (Sandbox Code Playgroud)

这允许您像在 shell 中一样在 shell 脚本中调用这些函数:

deactivate
Run Code Online (Sandbox Code Playgroud)

更新:我所描述的适用于 virtualenvwrapper 提供的其他功能(例如workon)。我错误地认为它也适用于停用,但这是一种更复杂的情况,因为它是一个仅在运行workonactivate运行的外壳程序中定义的函数。