Python找不到模块

Python找不到模块,python,python-import,Python,Python Import,给定在PyDev中创建的以下python项目: ├── algorithms │   ├── __init__.py │   └── neighborhood │   ├── __init__.py │   ├── neighbor │   │   ├── connector.py │   │   ├── __init__.py │   │   ├── manager.py │   │   └── references.py │   ├──

给定在PyDev中创建的以下python项目:

├── algorithms
│   ├── __init__.py
│   └── neighborhood
│       ├── __init__.py
│       ├── neighbor
│       │   ├── connector.py
│       │   ├── __init__.py
│       │   ├── manager.py
│       │   └── references.py
│       ├── neighborhood.py
│       ├── tests
│       │   ├── fixtures
│       │   │   └── neighborhood
│       │   ├── __init__.py
│       └── web
│           ├── __init__.py
│           └── service.py
├── configuration
│   ├── Config.py
│   └── __init__.py
├── __init__.py
└── webtrack
    |- teste.py
    ├── .gitignore
    ├── __init__.py
    ├── manager
        ├── Data.py
        ├── ImportFile.py
        └── __init__.py
我们一直在尝试将模块从一个文件夹导入另一个文件夹,但没有成功,例如:

from algorithms.neighborhood.neighbor.connector import NeighborhoodConnector
结果如下:

Traceback (most recent call last):
File "teste.py", line 49, in <module>
from algorithms.neighborhood.neighbor.connector import NeighborhoodConnector
ImportError: No module named algorithms.neighborhood.neighbor.connector
回溯(最近一次呼叫最后一次):
文件“teste.py”,第49行,在
从algorithms.Neighbory.Neighbory.connector导入NeighboryConnector
ImportError:没有名为algorithms.neighbor.neighbor.connector的模块
我们试图将其路径附加到sys.path变量,但没有成功

我们还尝试使用os.walk将所有路径插入到PATH变量中,但仍然得到相同的错误,即使我们检查了PATH是否包含查找模块的路径

我们正在Linux Ubuntu 13.10上使用Python 2.7

有什么我们可能做错的吗


提前感谢,

在Python2和Python3中导入的工作方式略有不同。首先是Python3和sane way(这似乎是您所期望的)。在Python3中,所有导入都与
sys.path
中的文件夹相关(有关模块搜索路径的更多信息)。顺便说一下,Python不使用
$PATH

因此,您可以从任何地方导入任何内容,而不用担心太多

在Python 2中,导入是相对的,有时是绝对的。包含可能对您有用的示例布局和一些导入语句

节“”包含有关如何在包之间导入的信息


综上所述,我认为您的
sys.path
是错误的。确保包含
算法的文件夹(即不是
算法本身,而是它的父文件夹)需要位于
sys.path中。在运行位于包中的脚本时,要正确导入是很困难的。您可以阅读一系列无法运行此类脚本的方法的描述

给出一个文件系统层次结构,如:

top_level/
    my_package/
        __init__.py
        sub_package/
            __init__.py
            module_a.py
            module_b.py
            sub_sub_package/
                __init__.py
                module_c.py
        scripts/
            __init__.py
            my_script.py
            script_subpackage/
                 __init__.py
                 script_module.py
只有几种方法可以使运行
my_script.py
正常工作

  • 第一种方法是将
    top\u level
    文件夹放入
    PYTHONPATH
    环境变量中,或者使用
    .pth
    文件实现同样的功能。或者,在解释器运行后,将该文件夹插入
    sys.path
    (但这可能会变得很糟糕)

    请注意,您正在将
    top\u level
    添加到路径,而不是
    my\u package
    !我怀疑这就是你在目前尝试这个解决方案时搞砸的。很容易出错

    然后,像
    import my_package.sub_package.module_a
    这样的绝对导入将基本正常工作。(只要当
    包.scripts.my_脚本作为
    主模块运行时,不要尝试导入它本身,否则您会得到一个奇怪的模块副本。)

    但是,绝对导入总是比相对导入更详细,因为您始终需要指定完整路径,即使您正在从
    模块a
    导入同级模块(或“侄女”模块,如
    模块c
    )。对于绝对导入,获取模块c
    的方法总是从my_package.sub_package.sub_sub_package导入模块c
    中获取大量丑陋的代码

  • 因此,使用相对导入通常更为优雅。唉,他们很难从一个脚本开始工作。唯一的办法是:

  • 使用
    -m
    标志(例如
    python-m my_package.scripts.my_script
    )从
    顶层
    文件夹运行
    my_script
    ),并且从不按文件名运行

    如果您在不同的文件夹中,或者使用不同的方法运行脚本(如在IDE中按F5),则该脚本将不起作用。这有点不灵活,但实际上没有任何方法使其更容易(直到PEP 395未出错并实现)

  • 为绝对导入设置
    sys.path
    like(例如,将
    top\u level
    添加到
    PYTHONPATH
    或其他内容),然后使用
    \uuuuuuuu包
    字符串告诉Python脚本的预期包是什么。也就是说,在
    my_script.py
    中,您希望在所有相关导入之前放置类似的内容:

    if __name__ == "__main__" and __package__ is None:
        __package__ = "my_package.my_scripts"
    
    如果重新组织文件组织并将脚本移动到其他包中,则需要进行更新(但这可能比更新大量绝对导入的工作量要少)

  • 一旦您实现了其中一个解决方案,您的导入就可以变得更简单。从
    模块a
    导入
    模块c
    将变成
    从.sub\u sub\u包导入模块c
    。在
    my_script
    中,像从..子包导入模块a
    这样的相对导入将正常工作


    只需在每个.py文件中设置
    \uuuuuu package\uuuu=None
    。它将自动设置所有包层次结构

    之后,您可以自由使用绝对模块名称进行导入

    from algorithms.neighborhood.neighbor.connector import NeighborhoodConnector
    

    我知道这是一个老帖子,但我还是要发布我的解决方案

    他也有类似的问题。在导入包之前,只添加了具有以下行的路径:

    sys.path.append(os.path.join(os.path.dirname(__file__), '..')) 
    from lib import create_graph
    

    您是否验证了问题在进口链上发生的距离?也就是说,
    导入算法、邻居、邻居、连接器是否失败?关于导入算法、邻域、邻域、导入算法、邻域和导入算法,Python 2或Python 3?BrenBarn我们尝试了您的建议,得到了相同的错误,项目树中的“teste.py”在哪里?是项目的顶层吗(您所显示的未命名顶级包之上的级别)在
    sys.path
    ?如果是,那么您应该能够使用绝对导入,例如:
    ,从您的_package.algorithms.neighbor.connector导入neighborhood connector
    。或者,如果您正确执行脚本(将
    -m
    sys.path
    一起使用,或者通过顶级文件夹中的相对路径进行设置)您应该