python包导入在本地工作,然后在cronjob中爆炸

时间:2016-09-30 21:31:07

标签: python bash macos unix crontab

运行cronjob我收到以下错误:

From cchilders@C02S21TWG8WMMBP.localdomain  Fri Sep 30 15:58:00 2016
Return-Path: <cchilders@C02S21TWG8WMMBP.localdomain>
X-Original-To: cchilders
Delivered-To: cchilders@C02S21TWG8WMMBP.localdomain
Received: by C02S21TWG8WMMBP.localdomain (Postfix, from userid 501)
    id D84CE1453D2; Fri, 30 Sep 2016 15:58:00 -0500 (CDT)
From: cchilders@C02S21TWG8WMMBP.localdomain (Cron Daemon)
To: cchilders@C02S21TWG8WMMBP.localdomain
Subject: Cron <cchilders@C02S21TWG8WMMBP> /usr/local/bin/python ~/scripts/updates/update_files.py pull
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=cchilders>
X-Cron-Env: <USER=cchilders>
X-Cron-Env: <HOME=/Users/cchilders>
Message-Id: <20160930205800.D84CE1453D2@C02S21TWG8WMMBP.localdomain>
Date: Fri, 30 Sep 2016 15:58:00 -0500 (CDT)

Traceback (most recent call last):
  File "/Users/cchilders/scripts/updates/update_files.py", line 12, in <module>
    from ez_scrip_lib.updates import pull_system_file_from_scripts_project_and_update_it, push_system_file_to_scripts_project
ImportError: No module named ez_scrip_lib.updates

但是这个库绝对可用:

In [1]: from ez_scrip_lib.updates import pull_system_file_from_scripts_project_and_update_it, push_system_file_to_scripts_project

In [2]: 

/scripts/updates/update_files.py:

#!/usr/bin/env python


import sys
from ez_scrip_lib.updates import pull_system_file_from_scripts_project_and_update_it, push_system_file_to_scripts_project

files = [{'real_path': '.fake', 'repo_path': 'bash/fake-one'},
         {'real_path': '.fake2', 'repo_path': 'bash/fake2'},
         {'real_path': '.fake3', 'repo_path': 'bash/fake3'}
]

callbacks = {'pull': pull_system_file_from_scripts_project_and_update_it,
             'push': push_system_file_to_scripts_project}

args = sys.argv
purpose_arg = args[1]

for f in files:
    callbacks[purpose_arg](**f)

最近我改变了shebang以匹配,使用#!/usr/local/bin/python仍然无法正常工作

我现在找到我的包的方式来自我的.bash_profile:

SCRIPTS="$HOME/scripts"
export PYTHONPATH="${PYTHONPATH}:$SCRIPTS"

脚本项目:

〜/脚本/

__init__.py
~/scripts/__init__.py
~/scripts/ez_scrip_lib/__init__.py
~/scripts/ez_scrip_lib/updates.py
~/scripts/updates/update_files.py

我的库ez_scrip_lib也在脚本项目中,为方便起见(我一次在一个编辑器中更新所有内容)。它可能应该被打破,因为它非常大,但没有一次我的脚本在查找ez_scrip_lib内的内容时遇到问题。只有在这个cronjob中它才会失败

这个脚本在命令行运行时运行正常:

./scripts/updates/update_files.py pull

从crontab中删除python解释器,因为脚本已经有了shebang(一个SO建议)也不起作用:

*/1 * * * * ~/scripts/updates/update_files.py pull

同样的错误

由于某些原因,Cronjobs似乎总是无法运行python文件,但至少在Mac上我自动收到错误日志。如何在运行python脚本时让这个cronjob找到我的包?谢谢

1 个答案:

答案 0 :(得分:1)

Cron不知道哪个目录与项目相关,只知道相对于自身的目录。它很可能在la-la land的某个地方寻找模块。快速修复可能是指定脚本的工作目录,然后尝试导入模块:

os.chdir("/Users/cchilders/scripts/updates")

或者沿着这些方向的东西应该让事情恢复正常......