python从子目录导入

时间:2014-10-13 16:57:31

标签: python import

我有一个文件夹结构:

mainapp.py
+Level1
   __init__.py
   +Level2
       helper.py
       __init__.py
       utilities.py
       testapp.py

在mainapp.py中我想导入helper.py。我可以使用

来做到这一点
import Level1.Level2.helper

导入了helper.py,但在尝试解析helper.py的导入时失败了。在这种情况下,helper.py有

from Level2 import utilities

引发了

ImportError: No module named Level2

我做错了什么?这是我尝试导入的方式吗?我发现的所有例子都只是试图深入一级,我尝试遵循相同的指导无济于事。

我正在使用Python3

编辑:LEVEL1及以下是我下载的外部库。我不能修改它们。在level2中是一个testapp,它附带了使用helper和utilities的库。运行此测试应用程序。

但是我需要能够在我的主应用程序中使用这些文件来生成2个文件夹

EDIT2:我认为我的问题源于我的工作目录是mainapp.py所在的目录。当我使用完全限定的路径LEvel1.Level2.helper导入时,但是一旦帮助程序尝试导入Level2,就会有我目前的工作目录中没有level2。有没有办法给别名这个?或者以某种方式将他们的导入相对于他们的位置,而不是我的工作目录?

2 个答案:

答案 0 :(得分:2)

运行python脚本时,执行脚本的位置非常重要,因为该路径将成为import s(所有导入)搜索包/模块的相对路径之一。我在谈论sys.path

因此,在了解该库的其他内容时,您只需将Level1路径添加到sys.path中,然后将内部Level2子包暴露给全世界。

假设您在与mainapp.py相同的文件夹中的bash shell中,可以使用PYTHONPATHLevel1路径添加到sys.pah

$ export PYTHONPATH=./Level1

然后helper.py将能够找到utilities模块甚至从外部执行mainapp.py

观点:

我不知道这个库及其工作原理,但在我看来,使用包名本身从相同的包中导入它是不正确的,或者至少不是一个好的做法。在这里你有一个例子,如果你在同一级别或父级,你只能导入该包。可能测试应用程序正在运行,因为正如您所说,它与utilities处于同一个程序包(级别)。

原始答案:

您需要的是Intra-package References。在特定情况下,utilitieshelper属于同一,您需要:

from . import utilities

答案 1 :(得分:1)

helper.py位于Level2模块中,因此在其导入上下文中隐含了这一点。 helper.py中的导入行应改为

import utilities

或者,您可以将Level1的路径添加到PYTHONPATH。这将允许您直接导入Level1下的所有模块,而无需额外的命名空间,例如

from Level2 import utilities

根据您的编辑,这听起来像您需要的。可能有第三个选项涉及修补sys.modules,但这将涉及修补sys.modules。