python - 从 Python 3.6 中的父文件夹导入类
问题描述
在某个程序中,我有一个抽象类,应该在两个不同的子包中实现不同的目的。这种结构的简化版本是:
programme/
__init__.py
Abstract.py
pkgA/
__init__.py
ClassA.py
pkgB/
__init__.py
ClassB.py
直到 Python 3.2(我相信),可以在 a 子文件夹中使用相对引用导入 Abstract 类:
from .. import Abstract
使用 Python 3.6 会产生错误消息:
ValueError: attempted relative import beyond top-level package
经典(和丑陋)的替代方法是在运行时将父文件夹添加到路径中:
import sys
import os
sys.path.append(os.getcwd() + '/..')
from programme import Abstract
但这也失败了:
ModuleNotFoundError: No module named 'programme'
现在用 Python 3.6 是如何做到的?最好在运行时不修改路径。
解决方案
您可以在顶层使用 __init__.py,program/__init__.py,然后从 program 导入子模块。
例子:
# programme/__init__.py
from .Abstrac import Abstract
# programme/Abstract.py
class Abstract:
def __init__(self):
print('Abstract')
# programme/pkgA/ClassA.py
from programme import Abstract
class ClassA(Abstract):
def __init__(self):
super().__init__()
if __name__ == '__main__':
a = ClassA()
请注意,如果您作为脚本运行,您应该执行以下操作:
$ cd programme
$ python -m programme.classA.ClassA
Abstract
推荐阅读
- firebase - 如何修复 Xcode 12 beta 6 中的 ASAuthorization 错误?
- angular - 使用@input 对角度组件进行单元测试
- javascript - 循环遍历嵌套的 Typescript 对象
- java - 使用 ObjectOutputStream 将 ArrayList 写入文件时如何保留换行符?
- powershell - PowerShell 在“(”上拆分会引发错误:“没有足够的)”。
- google-apps-script - 用于在从表单插入的行上插入时间戳的 Google 表格脚本
- python - Python 从二进制文件中读取“20”而不是“00”
- foreach - SwiftUI - 在 ForEach 中获取 TextField 数组
- linux - How to send a packed advertising packet with BlueZ 5 and the 5.4 kernel on Ubuntu 20.04
- google-chrome - Chrome Web Serial API not working in VueJs Web app