Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.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 为什么我必须在包中使用相对导入';s_uuuinit_uuuuu.py?_Python_Python Import - Fatal编程技术网

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导入系统,尽管我阅读了互联网上关于它的每一篇文章。