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

时间:2013-09-03 16:16:34

标签: python django namespaces setuptools

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

  • 公司django的共享
  • 公司django的共享-dev的
  • 公司蟒共享
  • 公司蟒共享-dev的

可以使用setuptools和命名空间进行安装:

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

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

  • company.foo.settings

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

$ ./manage.py shell

我收到错误::

ImportError: Could not import settings 'company.foo.settings' (Is it on sys.path?): No module named foo.settings

我真的无法弄清楚如何在django应用程序中使用命名空间。如果我启动一个shell并执行:

import company
company.__path__

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

修改

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

编辑2

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

3 个答案:

答案 0 :(得分:0)

您是否尝试将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( '/路径/到/文件夹/含有/公司')

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

from ..company import foo

答案 1 :(得分:0)

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

Django Docs

中显示的

django-admin.py migrate --settings=mysite.settings

答案 2 :(得分:0)

我现在找到的唯一方法如下:

  • 请勿在setuptools.setup()
  • 中使用namespace_packages参数

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

__import__('pkg_resources').declare_namespace(__name__)

如果我没有以相同的顺序安装我的库,我没有做过很多测试,如果这样可行,但至少,我能够导入我的django设置(以及其他所有设置)。

修改

这最终不是一个可行的解决方案,因为如果卸载并重新安装librairies,它们将删除超出应有的数量,因此最终会丢失模块。

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

编辑2

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