python子文件夹导入混乱
假设我有一个如下所示的文件夹结构:python子文件夹导入混乱,python,python-3.x,python-3.3,python-import,python-module,Python,Python 3.x,Python 3.3,Python Import,Python Module,假设我有一个如下所示的文件夹结构: . ├── A │ ├── a.py │ └── b.py └── main.py 这些文件包含以下内容: b、 py: a、 py: main.py: from A import a 如果运行python3.3 A/A.py或python3.3 B/B.by,则不会出现错误。但是,如果运行python3.3 main.py,则会发生以下错误: Traceback (most recent call last): File "main.py",
.
├── A
│ ├── a.py
│ └── b.py
└── main.py
这些文件包含以下内容:
b、 py:
a、 py:
main.py:
from A import a
如果运行python3.3 A/A.py
或python3.3 B/B.by
,则不会出现错误。但是,如果运行python3.3 main.py
,则会发生以下错误:
Traceback (most recent call last):
File "main.py", line 1, in <module>
from A import a
File "/tmp/python_imports/A/a.py", line 1, in <module>
from b import BClass
ImportError: No module named 'b'
回溯(最近一次呼叫最后一次):
文件“main.py”,第1行,在
从进口
文件“/tmp/python\u imports/A/A.py”,第1行,在
从b导入b类
ImportError:没有名为“b”的模块
将a.py中的导入行更改为import a.b
会起作用,但显然python3.3 a/a.py
会失败。实际上,我对运行python3.3 A/A.py
不感兴趣,但我希望模块可以从多个位置导入。因此,a.py应导入b.py,而不管a.py导入到何处
如何解决此问题?您需要
A
目录中的初始化.py
文件(空的就可以了)。否则,python不会将其识别为包
现在您是一个is包,应该使用绝对导入或显式相对导入。在这种情况下,在
A/A.py
中,使用A.b import BClass中的或.b import BClass中的在A
目录中需要一个\u init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuupy
文件(空即可)。否则,python不会将其识别为包
现在您是一个is包,应该使用绝对导入或显式相对导入。在这种情况下,在A/A.py
中,使用A.b import BClass
中的或.b import BClass中的在A
目录中需要一个\u init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuupy
文件(空即可)。否则,python不会将其识别为包
现在您是一个is包,应该使用绝对导入或显式相对导入。在这种情况下,在A/A.py
中,使用A.b import BClass
中的或.b import BClass中的在A
目录中需要一个\u init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuupy
文件(空即可)。否则,python不会将其识别为包
现在您是一个is包,应该使用绝对导入或显式相对导入。在这种情况下,在A/A.py
中,使用A.b import BClass中的或.b import BClass中的导入BClass
除了我在注释中提到的包必须导入的\u init\uuuuuuuuuuuuuuuuuuuuuuuuuu.py
之外,还需要相对导入同级模块:
from .b import BClass
然后它也可以在Python3中工作
当然,您也可以导入全名:
from A.b import BClass
但是,您的模块在包树中不容易重新定位
但是,无论哪种方式,您都不能将a.py
作为独立的应用程序使用。要实现这一点,您需要在import
语句周围加上try
/除了
,并在第一个版本失败时尝试其他版本:
try:
from .b import BClass
except ValueError:
from b import BClass
但这是可以理解的。在更大的系统中,模块可能依赖于包中的其他模块,否则它们可能不应该是包的一部分,而是独立的。如果存在这种依赖关系,那么将模块当作独立模块使用当然会有问题。除了我在评论中提到的包必须使用的\uuu init\uuuuuuuuupy
之外,您还需要相对导入同级模块:
from .b import BClass
然后它也可以在Python3中工作
当然,您也可以导入全名:
from A.b import BClass
但是,您的模块在包树中不容易重新定位
但是,无论哪种方式,您都不能将a.py
作为独立的应用程序使用。要实现这一点,您需要在import
语句周围加上try
/除了
,并在第一个版本失败时尝试其他版本:
try:
from .b import BClass
except ValueError:
from b import BClass
但这是可以理解的。在更大的系统中,模块可能依赖于包中的其他模块,否则它们可能不应该是包的一部分,而是独立的。如果存在这种依赖关系,那么将模块当作独立模块使用当然会有问题。除了我在评论中提到的包必须使用的\uuu init\uuuuuuuuupy
之外,您还需要相对导入同级模块:
from .b import BClass
然后它也可以在Python3中工作
当然,您也可以导入全名:
from A.b import BClass
但是,您的模块在包树中不容易重新定位
但是,无论哪种方式,您都不能将a.py
作为独立的应用程序使用。要实现这一点,您需要在import
语句周围加上try
/除了
,并在第一个版本失败时尝试其他版本:
try:
from .b import BClass
except ValueError:
from b import BClass
但这是可以理解的。在更大的系统中,模块可能依赖于包中的其他模块,否则它们可能不应该是包的一部分,而是独立的。如果存在这种依赖关系,那么将模块当作独立模块使用当然会有问题。除了我在评论中提到的包必须使用的\uuu init\uuuuuuuuupy
之外,您还需要相对导入同级模块:
from .b import BClass
然后它也可以在Python3中工作
当然,您也可以导入全名:
from A.b import BClass
但是,您的模块在包树中不容易重新定位
但是,无论哪种方式,您都不能将a.py
作为独立的应用程序使用。要实现这一点,您需要在import
语句周围加上try
/除了
,并在第一个版本失败时尝试其他版本:
try:
from .b import BClass
except ValueError:
from b import BClass
但这是可以理解的。在更大的系统中,模块可能依赖于包中的其他模块,否则它们可能不应该是包的一部分,而是独立的。如果有这样的依赖关系,使用一个模块就像我