我想设置一个crontab来运行Python脚本。
假设脚本是这样的:
#!/usr/bin/python
print "hello world"
有没有办法指定一个virtualenv让Python脚本在其中运行?简而言之,我只会这么做:
~$ workon myenv
我可以在crontab中做些等效的事情来激活virtualenv吗?
发布于 2010-11-11 09:28:19
如果您使用的是"workon“,那么您实际上使用的是"virtualenv wrapper”,它是位于virtualenv之上的另一个抽象层。可以通过cd进入您的virtualenv根目录并运行以下命令来单独激活virtualenv:
source bin/activate
workon是由virtualenv wrapper提供的命令,而不是virtualenv,它做一些普通的virtualenv不一定需要的额外工作。您真正需要做的就是在您的virtualenv根目录中查找bin/activate文件,以“激活”一个virtualenv。
您可以将crontab设置为调用执行以下操作的bash脚本:
#! /bin/bash
cd my/virtual/env/root/dir
source bin/activate
# virtualenv is now active, which means your PATH has been modified.
# Don't try to run python from /usr/bin/python, just run "python" and
# let the PATH figure out which version to run (based on what your
# virtualenv has configured).
python myScript.py
发布于 2012-10-12 05:00:21
另一个对我很有效的解决方案...
0 9 * * * /path/to/virtenv/bin/python /path/to/cron_script.py
我更喜欢直接从virtualenv使用python…
发布于 2021-09-02 22:34:24
我对workon
不是很确定,但对于venv
来说,这是非常简单的。唯一要记住的是,crontab
在默认情况下使用sh
,而不是bash
,因此您需要使用.
命令而不是source
。
如果您有一个~/myproject/main.py
文件,下面是一些示例
* * * * * cd ~/myproject && . .venv/bin/activate && python main.py > /tmp/out1 2>&1
您也可以直接调用venv目录中python
的具体路径,这样就不需要调用activate
了。
* * * * * ~/myproject/.venv/bin/python ~/myproject/main.py > /tmp/out2 2>&1
这样做的缺点是您需要指定项目路径两次,这使得维护变得更加棘手。为了避免这种情况,您可以使用shell变量,以便只指定一次项目路径:
* * * * * project_dir=~/myproject ; $project_dir/.venv/bin/python $project_dir/main.py > /tmp/out3 2>&1
https://stackoverflow.com/questions/4150671
复制相似问题