Python 正确设置导入:`from x import y`有效,而`import x.y`无效
设置模块的导入逻辑时遇到问题。结构如下:Python 正确设置导入:`from x import y`有效,而`import x.y`无效,python,python-3.x,module,python-import,Python,Python 3.x,Module,Python Import,设置模块的导入逻辑时遇到问题。结构如下: fishy ├── fishy │ ├── incl │ │ ├── fish │ │ │ ├── __init__.py │ │ │ └── salmon │ │ │ ├── __init__.py │ │ │ └── salmon.py │ │ ├── fish_farm.py │ │ └── __init__.py │ └── __init__.py ├
fishy
├── fishy
│ ├── incl
│ │ ├── fish
│ │ │ ├── __init__.py
│ │ │ └── salmon
│ │ │ ├── __init__.py
│ │ │ └── salmon.py
│ │ ├── fish_farm.py
│ │ └── __init__.py
│ └── __init__.py
├── __init__.py
└─── setup.py
我想向上传递某些类/模块,以便从结构中较高的节点导入。因此,我设置了所有\uuuu init\uuuuuuy.py
文件,如下所示:
fishy/__init__.py
from .fishy import *
fishy/fishy/__init__.py
from .incl.fish import Salmon
from .incl import fish
fishy/fishy/incl/__init__.py
from .fish import Salmon
from . import fish
fishy/fishy/incl/fish/__init__.py
from .salmon import Salmon
fishy/fishy/incl/fish/salmon/__init__.py
from .salmon import Salmon
然而,这只能部分起作用。我可以很好地导入模块,它还包含正确的子模块/类:
In [1]: import fishy
In [2]: dir(fishy)
Out[2]:
['Salmon',
'__builtins__',
'__cached__',
'__doc__',
'__file__',
'__loader__',
'__name__',
'__package__',
'__path__',
'__spec__',
'fish',
'incl']
这些类型也是正确的:
In [3]: type(fishy)
Out[3]: module
In [4]: type(fishy.fish)
Out[4]: module
In [5]: type(fishy.fish.Salmon)
Out[5]: type
我还可以使用一种语法传递导入:
In [6]: from fishy import fish
但是另一种语法给了我一个错误,我不知道为什么
In [7]: import fishy.fish
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
<ipython-input-7-efdcfdf1b06a> in <module>
----> 1 import fishy.fish
ModuleNotFoundError: No module named 'fishy.fish'
[7]中的:导入fishy.fish
---------------------------------------------------------------------------
ModuleNotFoundError回溯(上次最近调用)
在里面
---->进口鱼
ModuleNotFoundError:没有名为'fishy.fish'的模块
为什么我可以从fishy import fish中执行
,但不能执行import fishy.fish
?我感到非常困惑,并且已经尝试解决这个问题好几个小时了。你能告诉我吗D谢谢 不管答案如何,我会告诉你不要使用import fishy.fish
,而是使用来自fishy import fish
syntaxok的,有点离题,但仍然。。。为什么?有点普遍的共识,你不是被迫这么做,但通常会更好。如果您执行导入fishy.fish
操作,则只能使用fishy
中的fish
模块,而不能使用其他模块,但您仍然必须像导入fishy.fish
一样使用它。相反,您应该要么导入fishy
然后使用fishy.fish
,要么从fishy导入fish
直接使用fish
。使用import x.y
的唯一原因之一是它隐藏了另一个名称。例如,如果您的个人mymodule
中有一个模块os
,则不应该从mymodule导入操作系统,因为这样会隐藏内置的os
模块。