【问题标题】:Django managment command executed by cron cause an errorcron 执行的 Django 管理命令导致错误
【发布时间】:2013-05-14 06:42:39
【问题描述】:

我有以下 cronjob:

0 0 * * * source /home/admin/data/virtualenvs/myapp/bin/activate && python /home/admin/data/virtualenvs/myapp/project/manage.py 1c-import >> /home/admin/data/logs/1c-import.log 2>&1

所以,在日志文件中我看到以下错误:

Traceback (most recent call last):
  File "/home/admin/data/virtualenvs/myapp/project/manage.py", line 28, in <module>
    execute_from_command_line(sys.argv)
  File "/home/admin/data/virtualenvs/myapp/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 443, in execute_from_command_line
    utility.execute()
  File "/home/admin/data/virtualenvs/myapp/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 382, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/admin/data/virtualenvs/myapp/local/lib/python2.7/site-packages/django/core/management/base.py", line 196, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/home/admin/data/virtualenvs/myapp/local/lib/python2.7/site-packages/django/core/management/base.py", line 232, in execute
    output = self.handle(*args, **options)
  File "/home/admin/data/virtualenvs/myapp/project/helper/management/commands/1c-import.py", line 94, in handle
    print 'Product [%s] with price %s and qty %s' % (product_title, product_price, product_qty)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 34-35: ordinal not in range(128)

但是当我尝试手动运行这个命令时 - 没关系。您怎么看 - 可能导致此错误的原因是什么?

【问题讨论】:

  • 与其激活venv试试:0 0 * * * /home/admin/data/virtualenvs/myapp/bin/python /home/admin/data/virtualenvs/myapp/project/manage.py 1c-import
  • 再次出现同样的错误

标签: django cron debian


【解决方案1】:

问题是 cron 的语言环境设置不正确。

/etc/environment设置

LANG=en_US.UTF-8

此链接将很有用:locale setting for cron job

还有这个问题:Python3: UnicodeEncodeError only when run from crontab

【讨论】:

  • service cron restart之后我看到[warn] /etc/environment has been deprecated for locale information; use /etc/default/locale for LANG=ru_RU.UTF-8 instead ... (warning).
【解决方案2】:

我的猜测是,当从 cron 作业运行它时,系统会尝试将您的产品名称、价格和数量转换为 ASCII,而当您手动运行它时它会选择不同的编码。 您的一种或多种产品的名称、价格和/或数量中将包含无法编码为 ASCII 的字符。

这样打印信息有帮助吗?:

ENCODING = "utf-8"
print 'Product [%s] with price %s and qty %s' % (product_title.encode(ENCODING), 
                      product_price.encode(ENCODING), product_qty.encode(ENCODING))

【讨论】:

  • 感谢您的回答!当我手动运行命令时,它运行良好 - 这就是为什么我认为问题不在此。
  • 如果另一个解决方案允许您保持原样编码,我会这样做。如果没有,试试这个,它对我有用。
  • 太棒了!这对我来说可以!非常感谢!:-) 但我还是不明白为什么手动运行命令没有错误?
  • 此时,我也没有。我的命令在一台机器上运行良好,但在另一台机器上却不行。 locale 命令的输出在两台机器上是相同的。 /etc/environment 文件都不包含 LANG 变量。如果我知道了,我会告诉你的。 :)
猜你喜欢
  • 2013-10-13
  • 2013-01-03
  • 2012-05-13
  • 1970-01-01
  • 2015-05-18
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
相关资源
最近更新 更多