首页 > 解决方案 > 嵌套 Python 包/Django 应用程序打包

问题描述

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

mylib-core 中的文件:

mylib-auth 中的文件:

这是两个要单独打包的库,其中mylib-auth依赖,其中mylib-core的类mylib-auth派生自mylib-core

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

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

这会导致以下错误:

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

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

标签: djangopython-3.xdjango-appspython-packaging

解决方案


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

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

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

一切都按预期工作。


推荐阅读