【问题标题】:How to execute a command from a virtual environment using `crontab` or `gnome-terminal`如何使用 `crontab` 或 `gnome-terminal` 从虚拟环境执行命令
【发布时间】:2012-12-30 21:49:21
【问题描述】:

当我想使用 virtualenv(1.8.2)virtualenvwrapper(3.6) 在虚拟环境中工作时,我只需运行 workon my_project。但是,我无法使用 crontabgnome-terminal 从虚拟环境执行命令

示例:

* * * * * workon my_project && python task.py

这没有被执行。 (任务写入文件)

gnome-terminal --tab -e "bash -c \"workon my_project;python task.py;exec bash\"" 这只是显示bash: workon: command not found,然后从系统环境执行程序。有关此命令的更多信息,请查看here

编辑

@Zaar Hai:在我的/home/myusername/.bashrc 中发起virtualenvwrapper 这个:

export WORKON_HOME=~/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
export PIP_VIRTUALENV_BASE=$WORKON_HOME
export PIP_RESPECT_VIRTUALENV=true

所以我尝试了这个命令:

gnome-terminal --tab -e "bash -c \"export WORKON_HOME=~/.virtualenvs;source /usr/local/bin/virtualenvwrapper.sh;export PIP_VIRTUALENV_BASE=$WORKON_HOME;export PIP_RESPECT_VIRTUALENV=true;source /home/myusername/.virtualenvs/my_project/bin/activate;exec bash\""

但我仍然得到与您在评论中发布的相同的输出。

【问题讨论】:

  • 我认为这个问题既适用于stackoverflow,也适用于superuserstackoverflow.com/faq#questions。 (程序员常用的软件工具)
  • 忘记workonactivate。使用 virtualenv 的 python 的绝对 python 路径,让任务更轻松、更安全地完成。喜欢:/home/myusername/.virtualenvs/myproject/bin/python task.py

标签: python virtualenv crontab gnome-terminal virtualenvwrapper


【解决方案1】:

通过 crontab:

0 10 * * * env -i bash -c 'export WORKON_HOME=~/.virtualenvs && source /usr/local/bin/virtualenvwrapper.sh && workon my_project && python task.py'

通过 gnome 终端:

gnome-terminal --tab -e 'bash -c "export WORKON_HOME=~/.virtualenvs && source /usr/local/bin/virtualenvwrapper.sh && workon my_project && python task.py " '

最好只创建一个 runme.sh 脚本:

#/bin/sh
set -e
export WORKON_HOME=~/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
workon my_project
exec python task.py

并通过 gnome 终端/crontab 运行此脚本。

【讨论】:

  • 当您只安装了virtualenv 时,这可能有效。但我也使用 virtualenvwrapper,所以这是我得到的:Traceback (most recent call last): File "<string>", line 1, in <module> ImportError: No module named virtualenvwrapper.hook_loader virtualenvwrapper.sh: There was a problem running the initialization hooks. If Python could not import the module virtualenvwrapper.hook_loader, check that virtualenv has been installed for VIRTUALENVWRAPPER_PYTHON=/home/myusername/.virtualenvs/my_project/bin/python and that PATH is set properly.
  • 顺便说一句,请查看我原始帖子的编辑以获取更多信息。
  • 我也使用virtualenvwrapper 并且几乎没有采购activate 就足够了。你有没有为你的virtualenv 定制的钩子。让我们将命令简化为:env -i bash -c 'export WORKON_HOME=~/.virtualenvs && source /usr/local/bin/virtualenvwrapper.sh && source /home/myusername/.virtualenvs/my_project/bin/activate && python ...'"
  • 问题是您在 double 引号内使用 $VAR - 它由执行整个命令的 shell 评估,而不是由内部 bash 评估。您需要使用单引号来防止启动 shell 评估字符串中的变量。
  • 我已经用最新的“什么有效”更新了答案。也不需要采购激活脚本和运行workon ...。他们主要是做保存的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
  • 2019-06-26
  • 2021-01-11
  • 1970-01-01
相关资源
最近更新 更多