Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.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,从同一模块导入:ImportError:无法导入名称“blah”,名称为_Python - Fatal编程技术网

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