Python,从同一模块导入:ImportError:无法导入名称“blah”,名称为
非常容易复制的问题。我当前的设置是:Python,从同一模块导入:ImportError:无法导入名称“blah”,名称为,python,Python,非常容易复制的问题。我当前的设置是: package/ __init__.py run.py 在我的init.py中,我有: 布拉赫=4 在我的run.py中,我有: 从包导入废话 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': 版画 我只是用python run.py运行它。但我越来越害怕:不能输入名称“废话” 为什么我不能从包中导入变量?我知道如何解决这个问题,我很想知道错误的原因。我假设您正在目录包中运行python run.py。
package/
__init__.py
run.py
在我的init.py中,我有:
布拉赫=4
在我的run.py中,我有:
从包导入废话
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
版画
我只是用python run.py运行它。但我越来越害怕:不能输入名称“废话”
为什么我不能从包中导入变量?我知道如何解决这个问题,我很想知道错误的原因。我假设您正在目录包中运行python run.py。Python然后在目录中查找名为package的包或module.py文件,但两者都不存在。由于无法导入符号blah,因此会引发ImportError。您的问题是您正试图从所处的模块中导入 这是我的结构
[syspath]
$ tree
.
├── mod
│ ├── __init__.py
│ └── run.py
└── orun.py
1 directory, 3 files
[syspath]
$ cat mod/run.py
#from mod import blah
from . import blah
print(blah)
[syspath]
$ cat orun.py
from mod import blah
print(blah)
[syspath]
$ python3 orun.py
4
[syspath]
$ python3 -m mod.run
4
在模块目录中,您实际上是模块的一部分,无法导入它,但是您可以将其作为同级引用,但前提是您作为模块的一部分运行,如在python3-m mod中。run-m作为模块运行
了解多一点,python导入会查找sys.path中可用的条目,
以下是模块外部的orun.py中的sys.path,以及模块内部的mod/run.py中的sys.path
[syspath]
$ python3 orun.py
['~/syspath',
'/usr/lib/python37.zip',
'/usr/lib/python3.7',
'/usr/lib/python3.7/lib-dynload',
'~/.local/lib/python3.7/site-packages',
'/usr/local/lib/python3.7/dist-packages',
'/usr/lib/python3/dist-packages']
[syspath]
$ python3 mod/run.py
['~/syspath/mod',
'/usr/lib/python37.zip',
'/usr/lib/python3.7',
'/usr/lib/python3.7/lib-dynload',
'~/.local/lib/python3.7/site-packages',
'/usr/local/lib/python3.7/dist-packages',
'/usr/lib/python3/dist-packages']
正如你看到的,当你在mod里面时,你在里面找不到另一个mod
尝试在目录中添加一个同名module.py的新文件,并为blah添加一个不同的值,您将看到代码使用该值执行
[syspath]
$ tree
.
├── mod
│ ├── __init__.py
│ ├── mod.py
│ └── run.py
└── orun.py
1 directory, 4 files
[syspath]
$ cat mod/mod.py
blah = 40
[syspath]
$ python3 mod/run.py
40
显然,您正试图将其作为一个包来执行,但您正在运行run.py,就像它是一个标准python脚本一样。就您如何运行模块而言,run.py没有模块的概念。你需要在这里重新设计你的设计。在包模块run.py中将是一个模块,这里是您的命名约定。所以module是包,run.py是一个模块。然后,您需要一个_umain__u; py来将其作为一个包执行,并且您需要更改run.py: run.py:
from variables import blah
print(blah)
__主要项目:
__init_uuuuuuuuy.py:
目录结构:
模块1/
-_uuuinit_uuuuu.py
-_uuumain_uuuuuuu.py
-run.py
要在模块1之外执行,请执行以下操作:
如果您不想将其作为一个包,只需创建一个名为package的目录,并在其中创建run.py和variables.py
variables.py:
blah=4
blahblah=8
blahblahblah=12
run.py:
from variables import blah
print(blah)
印刷品4
如果将run.py更改为:
from variables import blah, blahblah
print(blah)
print(blahblah)
[dkennetz@nodem103 package]$ python3.5 run.py
4
8
from variables import *
print(blah)
print(blahblah)
print(blahblahblah) # if this was added to variables.py as 12
也可以通过将run.py更改为以下值来导入所有变量:
from variables import blah, blahblah
print(blah)
print(blahblah)
[dkennetz@nodem103 package]$ python3.5 run.py
4
8
from variables import *
print(blah)
print(blahblah)
print(blahblahblah) # if this was added to variables.py as 12
它返回:
[dkennetz@nodem103 package]$ python3.5 run.py
4
8
12
在python中,包和模块是两个不同的概念。模块是一个py文件,包必须是一个dir,其中必须包含_uinit__uu.py __init__u;.py用于包,当您在包目录中运行run.py时,包目录不能被视为包,包目录当然不是模块。因此它引发了一个错误:ModuleNotFoundError:没有名为xxxx的模块 导入常规包时,将隐式执行此__init__.py文件,并将其定义的对象绑定到包命名空间中的名称
为什么这样的情况会引发ModuleNotFoundError:没有名为xxxx的模块?@LiuXiMin是的,这是我的问题如果你不想把它作为一个包运行,即使你是这样设置的,你应该只制作两个文件:run.py和variables.py,run.py的内部只需从变量导入blahYea,这是真的,但我宁愿从。进口废话。即使这不起作用。我并不是真的想把它作为一个包来运行。但是,即使是这样设置的,您是什么意思呢?您正在尝试从_uinit___; py.py导入,而没有在导入中显式调用____; py.py。只有当您将其作为包使用时,才能执行此操作。如果您是以脚本的形式运行的,那么不妨调用_init_uuuuuuuuuuupy.variables.py。您也在尝试从包导入,但run.py没有包的概念,因为它当前是结构化的,实际上在这一点上,包只是一个包含python脚本的目录。那么,如果不使用from module import blah,我将如何将blah导入到我的脚本中呢?这确实有效。但事实上,这的确是一种糟糕的风格。谢谢。我不想把它作为包运行。相反,我将重新构建它,使其能够作为一个模块运行。
[dkennetz@nodem103 package]$ python3.5 run.py
4
8
12