Python 为什么我必须在包中使用相对导入';s_uuuinit_uuuuu.py?
设置Python 为什么我必须在包中使用相对导入';s_uuuinit_uuuuu.py?,python,python-import,Python,Python Import,设置 test/ main.py pkg/ a.py __init__.py main.py包含: import pkg pkg.a from . import a \uuuu init\uuuu.py包含: import pkg pkg.a from . import a main.py可以无错误地运行 问题 将\uuuu init\uuuu.py的内容更改为 import a 运行main.py时出现以下错误: Tr
test/
main.py
pkg/
a.py
__init__.py
main.py
包含:
import pkg
pkg.a
from . import a
\uuuu init\uuuu.py
包含:
import pkg
pkg.a
from . import a
main.py
可以无错误地运行
问题
将\uuuu init\uuuu.py
的内容更改为
import a
运行main.py
时出现以下错误:
Traceback (most recent call last):
File "C:/Users/me/PycharmProjects/test/main.py", line 1, in <module>
import pkg
File "C:\Users\me\PycharmProjects\test\pkg\__init__.py", line 1, in <module>
import a
ModuleNotFoundError: No module named 'a'
回溯(最近一次呼叫最后一次):
文件“C:/Users/me/PycharmProjects/test/main.py”,第1行,在
进口包装
文件“C:\Users\me\PycharmProjects\test\pkg\\uuuuu init\uuuuu.py”,第1行,在
导入
ModuleNotFoundError:没有名为“a”的模块
有趣的是,\uuuuu init\uuuuuuuuuuuupy
可以直接使用python\uuuuuuuuuuuuuuuuuuupy
执行,而不会出现错误
发生了什么事?运行python脚本时,它的父文件夹将添加到
sys.path
- 运行main.py:
sys.path[0]='../test'
- 运行init.py:
sys.path[0]='../test/pkg'
\uuu init\uuuuuuuuuuupy
中“绝对像”导入一个
,但运行main.py
时,a.py
的父文件夹,'../test/pkg'
-不在sys.path中。这就是为什么会出现错误。但是,您的绝对导入是不完整的,因为它应该始终从顶级文件夹开始,例如
from test.pkg import a
您问题的最终答案:您不必使用相对导入强>
请参阅::建议使用绝对导入,因为如果导入系统配置不正确(例如当包中的目录最终位于sys.path上时),绝对导入通常更具可读性,并且往往表现更好(或至少提供更好的错误消息)
请记住,当\uuuuu name\uuuuu=“\uuuuu main\uuuuu”
时,相对导入不会在顶级脚本中工作,而只能从导入的模块中工作
您可以在此处了解有关绝对和相对导入的更多信息:我想你是在用Pycharm吧?那这就是混乱的原因之一 例如,假设您的目录如下所示
project1
p1.py
test/
__init__.py
main.py
pkg/
a.py
__init__.py
如果运行(F10)main.py默认工作目录将是project1/test
,它不包含a.py
,因此导入a
将找不到任何内容
但是如果您运行(F10)pkg/uuuu init_uuuuuuuuuuuuupy您的工作目录将是project1/test/pkg
,其中包含a.py
,它的工作方式与您测试的一样
因此,在这种情况下,如果您使用来自的
。导入一个
它将查找文件所在的目录,project1/test/pkg
,在这种情况下,无论您的工作目录是什么,它都将始终工作。这是因为您的工作目录是test
,import a
将只在test
中搜索,而不包括子目录。请尝试import pkg.a
,如果您运行main.py
@NatthaphonHongcharoen,它应该可以工作。谢谢。。。这让我非常困惑。为什么\uuuu init\uuuuuuuuy.py
不能像Python在其他情况下默认那样在同一文件夹中查找模块?@NatthaphonHongcharoen导入pkg.a
也会给出ModuleNotFoundError
。但问题是当您更改工作目录时,假设您在pkg
或高于test
的目录下工作,则会再次出错。这就是为什么相对路径在这些情况下更可取的原因。我理解你写的话,但我不理解你的回答/谢谢出于某种原因,我无法直观地使用Python导入系统,尽管我阅读了互联网上关于它的每一篇文章。