Python找不到模块
给定在PyDev中创建的以下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 │ ├──
├── 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
一起使用,或者通过顶级文件夹中的相对路径进行设置)您应该