【问题标题】:ImportError: Could not import settings 'company.foo.settings' (Is it on sys.path?): No module named foo.settingsImportError:无法导入设置“company.foo.settings”(是否在 sys.path 上?):没有名为 foo.settings 的模块
【发布时间】:2013-09-06 23:09:20
【问题描述】:

我被要求将一个大项目拆分为一些可重用的库(包)。所以我的想法是这样做:

  • 公司-django-共享
  • company-django-shared-dev
  • 公司-python-共享
  • company-python-shared-dev

这些可以通过 setuptools 和命名空间安装:

  • 公司
  • company.packagename
  • company.packagename.tests
  • company.util
  • 等等……

这一切都很好。我可以启动一个 shell 并执行我需要的任何导入。当我现在想在 django 项目中使用它时,问题就来了。我的设置在:

  • company.foo.settings

此时,由于 setuptools 安装了一些包,当我尝试时

$ ./manage.py 外壳

我得到错误::

ImportError: 无法导入设置“company.foo.settings”(是否在 sys.path 上?):没有名为 foo.settings 的模块

我真的不知道如何在 django 应用程序中使用命名空间。如果我启动一个 shell 并执行以下操作:

进口公司
公司.__路径__

找到已安装的路径,但未找到当前目录。我错过了什么?

编辑

我想指出,问题是 Python 在 company 下找不到任何包,因为 setuptools 安装的包将 company 定义为命名空间。

编辑 2

Django 只是对命名空间不满意。似乎没有可行的解决方案。

【问题讨论】:

    标签: python django namespaces setuptools


    【解决方案1】:

    您是否尝试将 DJANGO_SETTINGS_MODULE 环境变量设置为“company.foo.settings”? 来自 Djanjo 文档; https://docs.djangoproject.com/en/dev/topics/settings/#designating-the-settings

    当你使用 Django 时,你必须告诉它你正在使用哪些设置。通过使用环境变量 DJANGO_SETTINGS_MODULE 来执行此操作。

    DJANGO_SETTINGS_MODULE 的值应该是 Python 路径语法,例如mysite.settings。请注意,设置模块应位于 Python 导入搜索路径中。

    编辑: 您还可以将以下内容添加到 manage.py 文件的顶部吗? 导入系统 sys.path.append('/path/to/folder/contains/company')

    编辑2: 为了回应您的澄清,您可以尝试相对导入: http://www.python.org/dev/peps/pep-0328/#guido-s-decision

    from ..company import foo
    

    【讨论】:

    • 是的,该变量是在manage.py 脚本中设置的。问题是我做不到:from company import foo.
    【解决方案2】:

    尝试将设置文件的位置直接传递到命令行。

    django-admin.py migrate --settings=mysite.settingsDjango Docs 所示

    【讨论】:

    • 设置文件本身不是问题。 Django(真的是 Python)将无法找到包 foo,无论我如何通过它。
    【解决方案3】:

    我目前找到的唯一方法如下:

    • 不要在 setuptools.setup() 中使用 namespace_packages 参数

    相反,在__init__.py 文件中明确定义“命名空间”包:

    __import__('pkg_resources').declare_namespace(__name__)

    我没有做很多测试,如果我不按相同顺序安装我的库,这是否会起作用,但至少,我能够导入我的 django 设置(以及其他所有设置)。

    编辑

    这最终不是一个可行的解决方案,因为如果卸载并重新安装库,它们将删除更多的内容,因此最终会丢失模块。

    我最终在setuptools.setup() 中使用了namespace_packages,并为正在运行的django 项目使用了不同的第一级“命名空间”。

    编辑 2

    放弃所有这些,这个命名空间的东西似乎是个好主意,但最终只是 django 的噩梦。所以我将所有内容都恢复为非命名空间代码。我不高兴我必须这样做,但这就是与 django 合作的代价。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 2014-03-29
      • 2014-06-04
      • 1970-01-01
      • 2012-08-09
      • 2013-09-19
      相关资源
      最近更新 更多