Python Crontab运行特定virtualenv';为什么';不行?

Python Crontab运行特定virtualenv';为什么';不行?,python,bash,macos,cron,Python,Bash,Macos,Cron,你好 我试图通过使用MacOS cron作业来执行异步Django自定义命令,但似乎没有任何效果 首先,我尝试编写一个bash文件,该文件源于virtualenv,然后使用我的自定义命令执行manage.py: #!/bin/bash source "/Users/airiefenix//Workspaces/ytsm_container/venv/bin/activate" && python /.../manage.py my_command 但是我有 File "man

你好

我试图通过使用MacOS cron作业来执行异步Django自定义命令,但似乎没有任何效果

首先,我尝试编写一个bash文件,该文件源于virtualenv,然后使用我的自定义命令执行manage.py:

#!/bin/bash

source "/Users/airiefenix//Workspaces/ytsm_container/venv/bin/activate" && python /.../manage.py my_command
但是我有

File "manage.py", line 17, in <module>
"Couldn't import Django. Are you sure it's installed and (...)
运行“python_ytsm/../manage.py my_command”效果很好,但当我将其添加到cron列表时:

$ crontab -e
Cron文件:

01 * * * * python_ytsm "/Users/airiefenix/Workspace/ytsm_container/project/manage.py my_command"
绝对什么也没发生。我已经用crontab-l检查了cron作业列表,我的脚本就在那里。我还使用基本命令向crontab文件添加了一些其他行,如“touch file.txt”或“echo'hello'>>somefile.txt”,所有这些作业都正常执行

有什么问题吗?是我的化名吗?是否使用“自定义/虚拟”Python解释器?我很想提供更多的细节,但MacOS在记录cron作业时非常稀少


我使用的是MacOS Sierra,我知道cron被认为是不受欢迎的,但对我来说,它比使用launchdl容易得多,所以除非我确实无法通过cron使其工作,否则我希望继续使用它。谢谢。

在非交互式shell中,别名在默认情况下是禁用的,因此即使您源文件定义了别名,也不会使用它们。此外,点文件并非源于非交互式shell启动,因此当从cron调用命令时,不会对
.bashrc
.bash\u profile
.profile
、或您可能已定义别名的其他位置求值

如果您真的想要一个别名,请考虑:

# instruct cron to use bash as your shell
SHELL=/bin/bash

# . "$HOME/.bashrc" <- assumes that your .bashrc defines the alias python_ytsm
# shopt -s expand_aliases <- turns aliases on; off-by-default in noninteractive context
# ...and then your regular command.
01 * * * * . "$HOME/.bashrc" && shopt -s expand_aliases && python_ytsm "/Users/airiefenix/Workspace/ytsm_container/project/manage.py my_command"
#指示cron使用bash作为shell
SHELL=/bin/bash

# . “$HOME/.bashrc”
exec>/tmp/cron.log 2>&1;PS4=':$LINENO';set-x是一个很好的起点;这样,您将在
/tmp/cron.log
中获得日志,希望有一条更有用的错误消息。顺便说一句,请注意cron使用的
SHELL
的默认值是
/bin/sh
,而不是
bash
。这意味着只保证POSIX基线语法——例如,意思是
,而不是
源代码。(我不确定Sierra上默认的是哪个
/bin/sh
,所以我不知道哪些扩展在那里,哪些扩展不在那里——但安全的做法是假设只有POSIX sh标准保证的东西,除非您显式运行一个功能更强大的shell)。在crontab中,别名永远不可用。顺便说一句,关于virtualenvs不能在cron作业中工作的说法本身没有证据支持。如果别名从未被允许,我如何使用virtualenv的Python解释器运行Python脚本?
# instruct cron to use bash as your shell
SHELL=/bin/bash

# . "$HOME/.bashrc" <- assumes that your .bashrc defines the alias python_ytsm
# shopt -s expand_aliases <- turns aliases on; off-by-default in noninteractive context
# ...and then your regular command.
01 * * * * . "$HOME/.bashrc" && shopt -s expand_aliases && python_ytsm "/Users/airiefenix/Workspace/ytsm_container/project/manage.py my_command"