我被要求将一个大项目拆分成一些可重用的库(包)。所以我的想法就是这样做:
可以使用setuptools和命名空间进行安装:
这一切都很好。我可以启动一个shell并执行我需要的任何导入。当我现在想在django项目中使用它时,问题就出现了。我的设置在:
此时,由于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对名称空间不满意。似乎没有可行的解决方案。
答案 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)
答案 2 :(得分:0)
我现在找到的唯一方法如下:
namespace_packages
参数
相反,在__init__.py
文件中明确定义“名称空间”包:
__import__('pkg_resources').declare_namespace(__name__)
如果我没有以相同的顺序安装我的库,我没有做过很多测试,如果这样可行,但至少,我能够导入我的django设置(以及其他所有设置)。
修改强>
这最终不是一个可行的解决方案,因为如果卸载并重新安装librairies,它们将删除超出应有的数量,因此最终会丢失模块。
我最终在namespace_packages
中使用了setuptools.setup()
,并为正在运行的django项目使用了不同的第一级“命名空间”。
编辑2
废弃所有这些,这个名称空间的东西似乎是一个好主意,但最终只是成为django的噩梦。所以我将所有内容还原为非命名空间代码。我不高兴我必须这样做,但这是与django合作的代价。