【问题标题】:python3 relative imports when import modules from multiple locations从多个位置导入模块时的python3相对导入
【发布时间】:2017-02-27 13:29:18
【问题描述】:

我正在尝试从多个位置导入一个模块,但由于 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 导入类名

以下是“package_2/scriptb”导入: package_1.run 导入类名

但是,当我运行 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

【问题讨论】:

    标签: python python-3.x python-import relative-path


    【解决方案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
    

    【讨论】:

    • 感谢您的回复。所有的包都有 init.py 文件。我会编辑帖子,因为我忘记输入了。
    • 该死,我不能在子包中使用 "if name == 'main': ",因为它们没有被称为主程序,所以我仍然遇到同样的问题。假设我必须捕获 ImportError 异常..
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-08-16
      • 1970-01-01
      • 2016-03-20
      • 2010-09-21
      • 2015-01-27
      • 1970-01-01
      • 2018-05-16
      • 1970-01-01
      相关资源
      最近更新 更多