2

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

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

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

  • 公司
  • 公司.包名
  • company.packagename.tests
  • 公司.util
  • ETC...

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

  • company.foo.settings

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

$ ./manage.py 外壳

我得到错误::

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

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

进口公司
公司.__路径__

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

编辑

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

编辑 2

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

4

3 回答 3

0

我现在找到的唯一方法是:

  • 不要使用namespace_packagessetuptools.setup() 中的参数

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

__import__('pkg_resources').declare_namespace(__name__)

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

编辑

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

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

编辑 2

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

于 2013-09-05T19:51:44.857 回答
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 文件的顶部吗?import sys sys.path.append('/path/to/folder/contains/company')

EDIT2:响应您的澄清,您可以尝试相对进口: http: //www.python.org/dev/peps/pep-0328/#guido-s-decision

from ..company import foo
于 2013-09-03T18:54:16.697 回答
0

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

django-admin.py migrate --settings=mysite.settings如Django Docs中所见

于 2013-09-04T17:26:47.427 回答