Virtualenv 不会改变 Cronjob 中的 PYTHONPATH

Virtualenv does not change PYTHONPATH in Cronjob

Crontab 代码:

SHELL=/bin/bash
* * * * * /var/www/envs/venv/myproj/scripts/send_hit.sh

.sh 脚本:

#!/bin/bash
cd /var/www/envs/venv
source bin/activate

echo $PYTHONPATH
echo $PATH

输出:

X-Cron-Env: <LANG=en_US.UTF-8>
X-Cron-Env: <SHELL=/bin/bash>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
X-Cron-Env: <USER=root>


/var/www/envs/venv/bin:/usr/bin:/bin

如您所见,$PYTHONPATH 是空的。但是,我手动激活的时候真的不是。

[root@server venv]# source bin/activate
(venv)[root@server venv]# echo $PYTHONPATH
:/var/www/envs/venv/myproj:/var/www/envs/venv/lib/python2.7/site-packages/

来自man page,

Several environment variables are set up automatically by the cron(8) daemon. SHELL is set to /bin/sh, and LOGNAME and HOME are set from the /etc/passwd line of the crontab's owner. HOME and SHELL may be overridden by settings in the crontab; LOGNAME may not.

您应该在 crontab 文件或您的脚本中明确设置 $PYTHONPATH

This ServerFault post有几种在cron中设置环境变量的方法。

无法从 crontab 访问 PYTHONPATH 变量。您应该只在脚本中设置 PYTHONPATH 变量。

#!/bin/bash
cd /var/www/envs/venv
source bin/activate

PYTHONPATH=/path/to/python
export PYTHONPATH

echo $PYTHONPATH
echo $PATH