Python找不到Modu

2024-05-20 19:22:39 发布

您现在位置:Python中文网/ 问答频道 /正文

给定在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

我们试图将其路径附加到sys.path变量,但没有成功。

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

我们在LinuxUbuntu13.10上使用Python2.7。

我们会做错什么吗?

提前谢谢你


Tags: 模块frompyimport路径文件夹connectorinit
3条回答

我知道这是一个老职位,但我仍然要张贴我的解决方案。

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

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

在运行位于包中的脚本时正确导入是很困难的。您可以阅读this section of the (sadly deferred) PEP 395来了解运行这样一个脚本不起作用的一系列方法的描述。

提供文件系统层次结构,如:

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正常工作。

  1. 第一种方法是将top_level文件夹放入PYTHONPATH环境变量中,或者使用.pth文件来实现相同的功能。或者,在解释器运行后,将该文件夹插入sys.path(但这可能会变得很难看)。

    请注意,您正在将top_level添加到路径,而不是my_package!我怀疑这就是你在目前的解决方案尝试中遇到的麻烦。很容易出错。

    然后,像import my_package.sub_package.module_a这样的绝对导入基本上可以正常工作。(当它作为__main__模块运行时,不要尝试导入package.scripts.my_script本身,否则会得到该模块的奇怪副本。)

    但是,绝对导入总是比相对导入更详细,因为您始终需要指定完整路径,即使您要导入同级模块(或“侄女”模块,如module_a中的module_c)。对于绝对导入,获取module_c的方法总是一口又大又难看的代码from my_package.sub_package.sub_sub_package import module_c,而不管导入的是哪个模块。

  2. 因此,使用相对进口往往更优雅。唉,他们很难从剧本中找到工作。唯一的办法是:

    1. 使用-m标志(例如python -m my_package.scripts.my_script)从top_level文件夹中运行my_script,从不按文件名运行。

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

    2. 为绝对导入设置sys.path(例如将top_level添加到PYTHONPATH或其他内容),然后使用PEP 366__package__字符串告诉Python脚本的预期包是什么。也就是说,在my_script.py中,您需要将类似的内容放在所有相关导入之上:

      if __name__ == "__main__" and __package__ is None:
          __package__ = "my_package.my_scripts"
      

      如果重新组织文件组织并将脚本移动到不同的包中(但这可能比更新大量绝对导入要少)。

    一旦您实现了其中一个源,您的导入就可以变得更简单。从module_a导入module_c变为from .sub_sub_package import module_c。在my_script中,像from ..subpackage import module_a这样的相对导入只起作用。

刚刚准备好 __pacage__ = None 在每个.py文件中。它将自动设置所有包层次结构。

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

from algorithms.neighborhood.neighbor.connector import NeighborhoodConnector

相关问题 更多 >