【问题标题】:Django's locale files installed in weird placeDjango 的语言环境文件安装在奇怪的地方
【发布时间】:2015-06-22 13:01:54
【问题描述】:

我正在为我的组织创建一个新的环境设置脚本,但在安装 Django 时遇到了问题。在 virtualenv 下执行pip install Django==1.4.19 后,需要本地化支持的测试产生:

  ...
  File "/home/ubuntu/venvs/myenv/local/lib/python2.7/site-packages/django/utils/translation/__init__.py", line 105, in activate
    return _trans.activate(language)
  File "/home/ubuntu/venvs/myenv/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 194, in activate
    _active.value = translation(language)
  File "/home/ubuntu/venvs/meynv/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 184, in translation
    current_translation = _fetch(language, fallback=default_translation)
  File "/home/ubuntu/venvs/myenv/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 147, in _fetch
    res._info = res._info.copy()
AttributeError: 'NoneType' object has no attribute '_info'

深入了解 Django 的 trans_real.translation() 函数发现错误来自试图在 ~/venvs/myenv/local/lib/python2.7/site-packages/django/conf/locale 下查找目录 django,但是该目录不包含翻译文件或 LC_MESSAGES 目录:

(myenv)ubuntu@ubuntu:~$ ls ~/venvs/myenv/local/lib/python2.7/site-packages/django/conf/locale/en/
total 12
-rw-rw-r-- 1 ubuntu ubuntu 1637 Jun 22 13:51 formats.py
-rw-rw-r-- 1 ubuntu ubuntu 1094 Jun 22 13:51 formats.pyc
-rw-rw-r-- 1 ubuntu ubuntu    0 Jun 22 13:51 __init__.py
-rw-rw-r-- 1 ubuntu ubuntu  149 Jun 22 13:51 __init__.py

相反,.po 和 .mo 文件可以在 virtualenv 的根目录下找到:

(myenv)ubuntu@ubuntu:~$ ls -l ~/venvs/myenv/django/conf/locale/en/LC_MESSAGES/
-rw-rw-r-- 1 ubuntu ubuntu   356 Jun 22 13:51 django.mo
-rw-rw-r-- 1 ubuntu ubuntu 21041 Jun 22 13:51 django.po

一般情况下,~/venvs/myenv/local/lib/python2.7/site-packages/django 目录不包含 .po- 或 .mo-文件,所有这些文件都可以在 ~/venvs/myenv/django 下的相应子目录中找到。

Pip 版本是 7.0.3,如果我将它降级到 6.1.1 版本(我们之前一直在使用),翻译文件可以(正确地?)在 site-packages/django 下找到并且一切正常。

什么可能导致新点子出现这种特殊行为?

更新 看来djcelery 包也受此影响。它的 .html 文件(并且只有那些)安装在 virtualenv 的根目录下,而其余的则在 site-packages/djcelery 下:

/home/ubuntu/venvs/myenv/djcelery/
+-- templates
    +-- admin
    |   +-- djcelery
    |       +-- change_list.html
    +-- djcelery
        +-- confirm_rate_limit.html

这些 html 文件和 django 的 .po/.mo 文件之间有什么共同点吗?

【问题讨论】:

  • 您的项目设置中是否设置了LOCALE_PATHS
  • @marksweb 感谢您的输入,我没有。但我想强调的是,问题似乎是关于 pip 没有正确安装 Django,而不是关于 Django 找不到文件。另请参阅更新。
  • 我很想知道如何正确解决这个问题:它似乎发生在我的 jenkins 机器上(运行某种 jessie/sid),但不在我的 Mac 上。跨度>
  • 可能与stackoverflow.com/a/20370738/188有关,django/djcelery打包数据文件的方式。
  • 这里有同样的问题。非常感谢您找出翻译的奇怪位置!

标签: python django pip virtualenv


【解决方案1】:

不完全是一个优雅的修复,但如果您只需要启动并运行您的项目并且降级 pip 不是一种选择,则可以使用符号链接:

ln -s ~/.virtualenvs/<virtualenv>/django/conf/locale/en/LC_MESSAGES/ \
~/.virtualenvs/<virtualenv>/local/lib/python2.7/site-packages/django/conf/locale/en/

【讨论】:

    【解决方案2】:

    我在使用 Tox old django 1.2 项目进行测试时遇到了这个问题,我创建了以下自动解决它的函数:

    import os
    
    from distutils.sysconfig import get_python_lib
    from distutils.dir_util import copy_tree
    
    
    def resolve_pip_data_files(fix_packages=None):
        """
        :param fix_packages: list of packages to fix, defaults to Django
    
        """
        if fix_packages is None:
            fix_packages = ['django']
    
        env_path = os.environ.get('VIRTUAL_ENV', None)
        site_packages = get_python_lib()
    
        if not env_path:
            return  # not in virtual env
    
        for package in fix_packages:
            package_data_dir = os.path.join(env_path, package)
            package_dir = os.path.join(site_packages, package)
    
            if os.path.exists(package_data_dir) and os.path.exists(package_dir):
                copy_tree(package_data_dir, package_dir)
    
    if __name__ == '__main__':
        resolve_pip_data_files()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      • 2019-12-28
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      相关资源
      最近更新 更多