django - 嵌套 Python 包/Django 应用程序打包
问题描述
我有一个正在创建的库,用于跨多个应用程序使用。它由“主”包中的一组抽象基类和一系列可重用的 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-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 包的目录下添加一个可以解决这个问题(但显然不应该存在,因为这个文件是在我的核心包中定义的)。在此之后我得到错误。mylib
auth
mylib-core
__init__.py
mylib
ImportError: No module named 'mylib....'
测试和部署嵌套包的适当方法是什么?
解决方案
答案在文档中:pkgutil-style namespace packages
两个包都必须具有该mylib/__init__.py
文件并具有以下内容:
__path__ = __import__('pkgutil').extend_path(__path__, __name__)
一切都按预期工作。
推荐阅读
- python - JSONDecodeError:期望值
- php - 在 HTML 中运行 php
- curl - “* Connection #0 to host example.com保持不变”是什么意思?
- php - Pusher 不从后端发送任何信号
- android - LinearLayout 不在 ScrollView 内滚动
- python - 如何在 df Pandas Python 中更改元素的值
- c - 检查输入缓冲区 ncurses 中等待的项目数
- selenium - Selenium 获取 href 链接返回 null
- node-postgres - 枚举数组的参数化?
- python - Discord.py Cogs 错误 FileNotFoundError:[Errno 2] 没有这样的文件或目录:'./cogs'