从多个位置导入模块时的python3相对导入

时间:2017-02-27 13:29:18

标签: python-3.x import relative

我正在尝试从多个位置导入模块,但由于Python3中的相对导入已被禁用,因此无法使其生效。我想这样做,以便用户可以复制package_1并在终端上运行(使用主类);而另一个类被导入scriptb.py,这是一个Web应用程序前端。

-- projectfolder
-- projectfolder/
-- __init__.py
--- package_1/
------ __init__.py
------ subpackage_a/
------ subpackage_a/core/module1.py
------ subpackage_a/__init__.py
------ subpackage_a/core/__init__.py
------ run.py
--- package_2/
----- __init__.py
-- -- scriptb.py

这里的“package_1 / run.py”导入:     来自subpackage_a.core.module1 import classname

以下是“package_2 / scriptb”导入:     package_1.run import classname

但是当我运行scriptb.py时,我在run.py中收到以下错误     ImportError:没有名为'package_1.core'的模块

Traceback:
File "/directory/package_1/run.py", line 7, in <module>
    from subpackage_a.common.exceptions import Classname
ImportError: No module named 'subpackage_a.common'

有没有更好的方法来处理这个问题,然后捕获ImportError异常并在所有“package_a”模块中定义两个导入位置?

或者比这更好,这意味着每次导入两个模块

if __name__ == '__main__': 
    from package_1 import classname
else:
    from .package_1 import classname

由于

编辑:

为了将来参考,我必须在子包中执行此操作以导入核心文件夹中的其他模块

try:
    from package_1.core.module1 import classname:
except ImportError:
    from ..core.module2 import classname

以下仅适用于main:

if __name__ == '__main__':
    from package_1.core.module1 import classname:
except ImportError:
    from .package_1.core.module2 import classname

2 个答案:

答案 0 :(得分:1)

如果要将其用作包,则所有子目录必须具有 __ init __。py 。尝试实现以下文件结构。

-- projectfolder
-- projectfolder/
-- __init__.py
--- package_1/
------ __init__.py
------ subpackage_a/
-----------__init__.py**********
------ subpackage_a/core/module1.py
-------------------core/
-----------------------__init__.py**********
------ run.py
--- package_2/
----- __init__.py
-- -- scriptb.py

__ init __。py 文件添加到 subpackage_a 文件夹和 subpackage_a / core / 文件夹

已编辑:我认为您处理此方式的方式是更好的选择

if __name__ == '__main__': 
    from package_1 import classname
else:
    from .package_1 import classname

答案 1 :(得分:1)

嗯,正如您可以通过文件夹结构和“package_1 / run.py”和“package_2 / scriptb.py”中“subpackage_a”的使用看到的那样,实际上,“subpackage_a”不是“package_1”的子包。更好地使您的项目适应现实,并使“subpackage_a”成为一个真正的包,并使用distutils或类似的东西将其安装到python中。然后“run.py”和“scriptb.py”都可以使用它而不会恢复到任何相对导入黑客。