Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正确设置导入:`from x import y`有效,而`import x.y`无效_Python_Python 3.x_Module_Python Import - Fatal编程技术网

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
模块。