2012-02-02 60 views
0

我有一个manage.py命令,我使用ftplib来下拉文件。如果我从终端运行此命令,它工作正常。现在我想从脚本中调用它,以便cron可以每晚运行它。当我运行脚本时,它会因“django.db.utils.DatabaseError:no such table”错误而失败。我可以在没有任何错误的情况下从外部脚本运行manage.py,manage.py帮助。有任何想法吗?Django Manage.py外部脚本错误

处理方法从管理命令:

def handle(self, *args, **options): 
     ftp = ftplib.FTP('ftp.somesite.com') 
     ftp.login("anonymous") 
     ftp.cwd('commonupdater') 

     data = [] 
     ftp.dir(data.append) 

     file_lines = [line for line in data if 'mydat' in line and '.zip' in line] 
     files = [line for line in file_lines] 

     for filespec in files: 
      target = filespec.split(' ')[-1] 
      f = open('/tmp/' + target, 'wb') 
      self.getbinary(ftp, target, outfile=f) 
      f.close() 
      self.save_update(target, '/tmp/' + target) 

回溯

local.dbTraceback (most recent call last): 
    File "/home/rb/Workspaces/rms/ravelin/manage.py", line 14, in <module> 
    execute_manager(settings) 
    File "/home/rb/.virtualenvs/ravelin/lib/python2.7/site-packages/django/core/management/__init__.py", line 438, in execute_manager 
    utility.execute() 
    File "/home/rb/.virtualenvs/ravelin/lib/python2.7/site-packages/django/core/management/__init__.py", line 379, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/home/rb/.virtualenvs/ravelin/lib/python2.7/site-packages/django/core/management/base.py", line 191, in run_from_argv 
    self.execute(*args, **options.__dict__) 
    File "/home/rb/.virtualenvs/ravelin/lib/python2.7/site-packages/django/core/management/base.py", line 220, in execute 
    output = self.handle(*args, **options) 
    File "/home/rb/Workspaces/rms/ravelin/ravelog/management/commands/fetch_av_updates.py", line 57, in handle 
    self.save_update(target, '/tmp/' + target) 
    File "/home/rb/Workspaces/rms/ravelin/ravelog/management/commands/fetch_av_updates.py", line 30, in save_update 
    if len(av_list) < 1: 
    File "/home/rb/.virtualenvs/ravelin/lib/python2.7/site-packages/django/db/models/query.py", line 82, in __len__ 
    self._result_cache = list(self.iterator()) 
    File "/home/rb/.virtualenvs/ravelin/lib/python2.7/site-packages/django/db/models/query.py", line 273, in iterator 
    for row in compiler.results_iter(): 
    File "/home/rb/.virtualenvs/ravelin/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 680, in results_iter 
    for rows in self.execute_sql(MULTI): 
    File "/home/rb/.virtualenvs/ravelin/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 735, in execute_sql 
    cursor.execute(sql, params) 
    File "/home/rb/.virtualenvs/ravelin/lib/python2.7/site-packages/django/db/backends/util.py", line 34, in execute 
    return self.cursor.execute(sql, params) 
    File "/home/rb/.virtualenvs/ravelin/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py", line 234, in execute 
    return Database.Cursor.execute(self, query, params) 
django.db.utils.DatabaseError: no such table: 
+0

您使用的是哪个数据库后端?类似这样的事情可能会发生在sqlite和一个在settings.py中用相对路径指定的数据库名称。 – Raekkeri 2012-02-02 18:45:51

+0

我正在使用sqlite。我现在很确定这是一个路径/ pythonpath问题。 – RyanBrady 2012-02-02 19:23:44

回答

0

你可以试试这个?找出在命令行中使用的环境变量(set将提供该列表)。把它们放在shell脚本中,最后调用python脚本。在cron中,如下所示调用shell脚本。日志文件应该包含所有的细节。

 
10 5 * * * /home/myuser/some_wrapper_script.sh > /home/myuser/some_wrapper_script.log 2>&1 
+0

我写了一个额外的管理命令来检查os.environ [“PATH”]和sys.path。我检查了我设置的路径,一切都很好。我在外部脚本的项目目录中添加了一个cd,而不是调用manage.py的完整路径。这似乎解决了它。 – RyanBrady 2012-02-02 20:56:57