【问题标题】:Nested Python Packages/Django Application Packaging嵌套 Python 包/Django 应用程序打包
【发布时间】:2019-01-26 03:42:10
【问题描述】:

我正在创建一个库以供跨多个应用程序使用。它由“main”包中的一组抽象基类和一系列可重用的 Django 应用程序组成。

mylib-core 中的文件:

  • mylib/__init__.py
  • mylib/models.py
  • mylib/serializers.py
  • mylib/viewsets.py

mylib-auth 中的文件:

  • mylib/auth/__init__.py
  • mylib/auth/models.py
  • mylib/auth/serializers.py
  • mylib/auth/viewsets.py

这是两个要分开打包的库,其中mylib-auth依赖于mylib-coremylib-auth中的类派生自mylib-core中的类

我遇到的问题是,在为mylib-auth 运行测试运行程序时,找不到mylib-core 的文件。我已将mylib-core 包安装到mylib-auth 的virtualenv 中。

我认为这与我的嵌套包结构有关 - 我在两个包中都有一个 mylib 文件夹。似乎 python 只在包含 auth 子文件夹的父 mylib 目录中查找文件,而忽略了 venv/lib/.../mylib 目录中的文件。

这会导致以下错误:

当我尝试为mylib-auth 运行我的测试套件时,我收到一个错误,即找不到应用程序mylib.auth,因为mylib 没有属性auth - 尽管已将mylib-core 安装到我的virtualenv 中。在 auth 包中的 mylib 目录下添加 __init__.py 可以解决此问题(但显然不应该存在,因为该文件是在我的核心包中定义的)。在此之后我收到ImportError: No module named 'mylib....' 错误。

测试和部署嵌套包的适当方法是什么?

【问题讨论】:

    标签: django python-3.x django-apps python-packaging


    【解决方案1】:

    答案在文档中:pkgutil-style namespace packages

    两个包都必须有mylib/__init__.py 文件,并且包含以下内容:

    __path__ = __import__('pkgutil').extend_path(__path__, __name__)
    

    一切都按预期进行。

    【讨论】:

      猜你喜欢
      • 2016-04-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      • 2012-09-22
      • 2016-10-07
      • 2015-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多