我是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文件中的一个函数.
只是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)
相信我,它会节省你的调试时间)
很难让这样的服务变得有用。
. ${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 之外。
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)。我错误地认为它也适用于停用,但这是一种更复杂的情况,因为它是一个仅在运行workon或activate运行的外壳程序中定义的函数。
| 归档时间: |
|
| 查看次数: |
18999 次 |
| 最近记录: |