Python 相对导入-ModuleNotFoundError:没有名为x的模块

Python 相对导入-ModuleNotFoundError:没有名为x的模块,python,python-3.x,package,python-import,relative-import,Python,Python 3.x,Package,Python Import,Relative Import,这是我第一次真正坐下来尝试Python3,但似乎失败得很惨。我有以下两个文件: test.py config.py config.py中定义了一些函数和一些变量。我将其精简为以下内容: config.py debug = True import config print (config.debug) test.py debug = True import config print (config.debug) 我还有一个\uuuu init\uuuu.py 但是,我得到了以下错误: Mo

这是我第一次真正坐下来尝试Python3,但似乎失败得很惨。我有以下两个文件:

  • test.py
  • config.py
  • config.py中定义了一些函数和一些变量。我将其精简为以下内容:

    config.py

    debug = True
    
    import config
    print (config.debug)
    
    test.py

    debug = True
    
    import config
    print (config.debug)
    
    我还有一个
    \uuuu init\uuuu.py

    但是,我得到了以下错误:

    ModuleNotFoundError: No module named 'config'
    
    ImportError: cannot import name 'config'
    
    我知道py3公约使用绝对进口:

    from . import config
    
    但是,这会导致以下错误:

    ModuleNotFoundError: No module named 'config'
    
    ImportError: cannot import name 'config'
    
    所以我不知道在这里该做什么。。。非常感谢您的帮助。:)

    试过你的例子

    from . import config
    
    收到以下系统错误:
    /usr/bin/python3.4 test.py
    回溯(最近一次呼叫最后一次):
    文件“test.py”,第1行,在
    从…起导入配置
    系统错误:未加载父模块“”,无法执行相对导入


    这对我来说很有用:

    import config
    print('debug=%s'%config.debug)
    
    >>>debug=True
    
    用Python测试:3.4.2-PyCharm 2016.3.2


    在这个PyCharm旁边,您可以导入这个名称
    您必须单击
    config
    并显示一个帮助图标。
    TL;DR:您无法从执行的文件执行相对导入,因为
    \uuuu main\uuu
    模块不是包的一部分

    绝对导入-导入
    sys.path上可用的内容

    相对导入-导入与当前模块相关的内容,必须是包的一部分

    如果您以完全相同的方式运行两个变体,那么其中一个应该可以工作。下面是一个例子,可以帮助您了解发生了什么。让我们添加另一个
    main.py
    文件,其总体目录结构如下:

    .
    ./main.py
    ./ryan/__init__.py
    ./ryan/config.py
    ./ryan/test.py
    
    让我们更新
    test.py
    ,看看发生了什么:

    #config.py
    调试=真
    
    #test.py
    打印(名称)
    尝试:
    #正在尝试在父包中查找模块
    从…起导入配置
    打印(config.debug)
    del-config
    除恐怖外:
    打印('相对导入失败')
    尝试:
    #正在尝试在sys.path上查找模块
    导入配置
    打印(config.debug)
    除ModuleNotFoundError外:
    打印('绝对导入失败')
    
    #main.py
    导入ryan.test
    
    让我们先运行
    test.py

    $ python ryan/test.py
    __main__
    Relative import failed
    True
    
    这里的“test”是
    \uuuu main\uuu
    模块,不知道属于某个包的任何信息。但是,
    import config
    应该可以工作,因为
    ryan
    文件夹将被添加到
    sys.path

    让我们运行
    main.py

    $ python main.py
    ryan.test
    True
    Absolute import failed
    
    这里的测试在“ryan”包中,可以执行相对导入<代码>导入配置
    失败,因为Python 3中不允许隐式相对导入

    希望这有帮助


    注意:如果您坚持使用Python3,那么就不再需要
    \uuu init\uuu.py
    文件。

    此示例适用于Python3.6

    我建议在PyCharm中转到
    Run->Edit Configurations
    ,删除那里的所有条目,然后再次尝试通过PyCharm运行代码


    如果不起作用,请检查您的项目解释器(设置->项目解释器)并运行配置默认值(运行->编辑配置…。

    正如在原始帖子的评论中所述,这似乎是我出于任何原因使用的python解释器的问题,而不是python脚本的问题。我从python.org将WinPython包切换到官方的python3.6,它运行得很好。谢谢大家的帮助:)

    我想出来了。非常令人沮丧,尤其是来自蟒蛇2

    您必须向模块中添加
    ,无论它是相对的还是绝对的

    我创建了目录设置,如下所示

    /main.py
    --/lib
      --/__init__.py
      --/mody.py
      --/modx.py
    
    modx.py

    def does_something():
        return "I gave you this string."
    
    莫迪

    from modx import does_something
    
    def loaded():
        string = does_something()
        print(string)
    
    main.py

    from lib import mody
    
    mody.loaded()
    
    当我执行main时,就会发生这种情况

    $ python main.py
    Traceback (most recent call last):
      File "main.py", line 2, in <module>
        from lib import mody
      File "/mnt/c/Users/Austin/Dropbox/Source/Python/virtualenviron/mock/package/lib/mody.py", line 1, in <module>
        from modx import does_something
    ImportError: No module named 'modx'
    
    我不得不修改mody.py的import语句来修复它

    try:
        from modx import does_something
    except ImportError:
        from .modx import does_something
    
    
    def loaded():
        string = does_something()
        print(string)
    
    然后我再次运行main.py并获得了预期的输出

    $ python main.py
    I gave you this string.
    
    最后,只是为了清理它,使它在2和3之间可移植

    from __future__ import absolute_import
    from .modx import does_something
    

    设置PYTHONPATH也有助于解决此问题

    下面是如何在Windows上完成的


    set PYTHONPATH=。
    在调用模块之前声明正确的sys.path列表:

    import os, sys
    
    #'/home/user/example/parent/child'
    current_path = os.path.abspath('.')
    
    #'/home/user/example/parent'
    parent_path = os.path.dirname(current_path)
    
    sys.path.append(parent_path)
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'child.settings')
    

    您可以简单地将以下文件添加到测试目录中,然后python将在测试之前运行它

    __init__.py file
    
    import os
    import sys
    sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
    

    您必须将项目路径附加到
    PYTHONPATH
    ,并确保使用绝对导入


    适用于UNIX(Linux、OSX等)

    适用于Windows

    set PYTHONPATH=%PYTHONPATH%;C:\path\to\your\project\
    

    绝对进口量

    set PYTHONPATH=%PYTHONPATH%;C:\path\to\your\project\
    
    假设我们有以下项目结构

    └── myproject
        ├── mypackage
        │   ├── a.py
        └── anotherpackage
            ├── b.py
            ├── c.py
            └── mysubpackage
                └── d.py
    
    只需确保从项目的根目录开始引用每个导入。比如说,

    # in module a.py
    import anotherpackage.mysubpackage.d
    
    # in module b
    import anotherpackage.c
    import mypackage.a
    


    有关更全面的解释,请参阅根项目目录中的文章

    Set
    PYTHONPATH
    环境变量

    考虑类UNIX:

    export PYTHONPATH=.
    
    试一试


    这样做的目的是从同一文件夹级别导入。如果您直接尝试导入它,则假定它是一个从属的

    ,如果您使用的是python 3+,则尝试在下面添加行

    import os, sys
    dir_path = os.path.dirname(os.path.realpath(__file__))
    parent_dir_path = os.path.abspath(os.path.join(dir_path, os.pardir))
    sys.path.insert(0, parent_dir_path)
    

    对我来说,只需添加当前目录就行了

    使用以下结构:

    └── myproject
        ├── a.py
        └── b.py
    
    a、 py:


    我无法重现错误,您如何执行这段代码?我使用python附带的idle执行它,也作为
    python test.py
    ,它工作得非常好。我没有pyCharm,但可能是pyCharm的一些不良配置导致了这个问题,这很奇怪。我使用的是WinPython——只需从Python.org下载vanilla Python 3.6,就可以了。从没想过要检查翻译!谢谢我猜PYTHONPATH有点怪怪的。检查你