想象一下这个目录 struct :

app/
   __init__.py
   sub1/
      __init__.py
      mod1.py
   sub2/
      __init__.py
      mod2.py

我正在编码mod1,并且我需要从mod2导入一些东西.我怎么发动汽车呢?

我try 了from ..sub2 import mod2次,但我得到了一个"try 在非包装中进行相对导入".

我用谷歌搜索了一下,但只找到了"sys.path个操纵"黑客.没有干净的路吗?


编辑:我所有的__init__.py都是空的

Edit2:我之所以这么做是因为sub2包含跨子包(sub1subX等)共享的类.

编辑3:我要找的行为和第PEP 366节描述的一样(感谢约翰·B)

推荐答案

每个人似乎都想告诉你你应该做什么,而不仅仅是回答问题.

问题是,通过传递mod1,您正在以"_main___;"的身份运行模块.py作为口译员的参数.

PEP 328:

相对导入使用模块的_name__;属性来确定该模块在包层次 struct 中的位置.如果模块的名称不包含任何包信息(例如,它被设置为"_main___;"),则相关导入将被解析,就像模块是顶级模块一样,而不管模块在文件系统上的实际位置如何.

在Python2.6中,他们添加了相对于主模块引用模块的功能.PEP 366描述了这一变化.

Update:根据Nick Coghlan的说法,推荐的替代方案是使用-mswitch 在包内运行模块.

Python相关问答推荐

2维数组9x9,不使用numpy.数组(MutableSequence的子类)

如何将ctyles.POINTER(ctyles.c_float)转换为int?

当使用keras.utils.Image_dataset_from_directory仅加载测试数据集时,结果不同

Python json.转储包含一些UTF-8字符的二元组,要么失败,要么转换它们.我希望编码字符按原样保留

沿着数组中的轴计算真实条目

切片包括面具的第一个实例在内的眼镜的最佳方法是什么?

如何在Polars中从列表中的所有 struct 中 Select 字段?

在含噪声的3D点网格中识别4连通点模式

将pandas导出到CSV数据,但在此之前,将日期按最小到最大排序

如何根据rame中的列值分别分组值

Django Table—如果项目是唯一的,则单行

使用嵌套对象字段的Qdrant过滤

极点替换值大于组内另一个极点数据帧的最大值

如何为需要初始化的具体类实现依赖反转和接口分离?

如何提高Pandas DataFrame中随机列 Select 和分配的效率?

如果服务器设置为不侦听创建,则QWebSocket客户端不连接到QWebSocketServer;如果服务器稍后开始侦听,则不连接

对于数组中的所有元素,Pandas SELECT行都具有值

在聚合中使用python-polars时如何计算模式

将数据从一个单元格保存到Jupyter笔记本中的下一个单元格

使用美汤对维基百科表格进行网络刮擦未返回任何内容