给定在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。
我们会做错什么吗?
提前谢谢你
我知道这是一个老职位,但我仍然要张贴我的解决方案。
也有类似的问题。只是在导入包之前添加了以下行的路径:
在运行位于包中的脚本时正确导入是很困难的。您可以阅读this section of the (sadly deferred) PEP 395来了解运行这样一个脚本不起作用的一系列方法的描述。
提供文件系统层次结构,如:
只有几种方法可以使运行
my_script.py
正常工作。第一种方法是将
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
,而不管导入的是哪个模块。因此,使用相对进口往往更优雅。唉,他们很难从剧本中找到工作。唯一的办法是:
使用
-m
标志(例如python -m my_package.scripts.my_script
)从top_level
文件夹中运行my_script
,从不按文件名运行。如果您在不同的文件夹中,或者使用不同的方法运行脚本(如在IDE中按F5),则此操作将不起作用。这有点不灵活,但实际上没有任何方法使之更容易(直到PEP 395未被定义和实现)。
为绝对导入设置
sys.path
(例如将top_level
添加到PYTHONPATH
或其他内容),然后使用PEP 366__package__
字符串告诉Python脚本的预期包是什么。也就是说,在my_script.py
中,您需要将类似的内容放在所有相关导入之上:如果重新组织文件组织并将脚本移动到不同的包中(但这可能比更新大量绝对导入要少)。
一旦您实现了其中一个源,您的导入就可以变得更简单。从
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
相关问题 更多 >
编程相关推荐