我有一个文件夹结构:
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。有没有办法给别名这个?或者以某种方式将他们的导入相对于他们的位置,而不是我的工作目录?
答案 0 :(得分:2)
运行python脚本时,执行脚本的位置非常重要,因为该路径将成为import
s(所有导入)搜索包/模块的相对路径之一。我在谈论sys.path。
因此,在了解该库的其他内容时,您只需将Level1
路径添加到sys.path
中,然后将内部Level2
子包暴露给全世界。
假设您在与mainapp.py
相同的文件夹中的bash shell中,可以使用PYTHONPATH将Level1
路径添加到sys.pah
:
$ export PYTHONPATH=./Level1
然后helper.py
将能够找到utilities
模块甚至从外部执行mainapp.py
。
观点:
我不知道这个库及其工作原理,但在我看来,使用包名本身从相同的包中导入它是不正确的,或者至少不是一个好的做法。在这里你有一个例子,如果你在同一级别或父级,你只能导入该包。可能测试应用程序正在运行,因为正如您所说,它与utilities
处于同一个程序包(级别)。
原始答案:
您需要的是Intra-package References。在特定情况下,utilities
和helper
属于同一级,您需要:
from . import utilities
答案 1 :(得分:1)
helper.py位于Level2模块中,因此在其导入上下文中隐含了这一点。 helper.py中的导入行应改为
import utilities
或者,您可以将Level1的路径添加到PYTHONPATH。这将允许您直接导入Level1下的所有模块,而无需额外的命名空间,例如
from Level2 import utilities
根据您的编辑,这听起来像您需要的。可能有第三个选项涉及修补sys.modules,但这将涉及修补sys.modules。