【问题标题】:Importing submodules导入子模块
【发布时间】:2017-12-21 02:24:27
【问题描述】:

我是 python 新手,我很难克服导入系统的问题。

假设我的文件系统如下所示:

/src    
/src/main.py     
/src/submodules/   
/src/submodules/submodule.py   
/src/submodules/subsubmodules   
/src/submodules/subsubmodules/subsubmodule.py

所有文件夹(src、submodules、subsubmodules)都有__init__.py文件并为空。

在 submodule.py 我有:

from subsubmodules import subsubmodule

在 main.py 我有:

from submodules import submodule

当我运行 submodule.py python 接受导入。但是当我运行 main.py 时,python 会为 subsubmodule.py 的导入引发错误,因为 /src/submodules/subsubmodules/ 文件夹不在路径中。

唯一的解决方案是将 submodule.py 的导入更改为

  from submodules.subsubmodules import subsubmodule

在我看来,这似乎是一个糟糕的解决方案,因为在那之后我无法运行 submodule.py 并且我确信其他的东西是关键。

另一种解决方案是将以下代码添加到__init__.py 文件中:

import os
import sys
import inspect


cmd_subfolder = os.path.split(inspect.getfile(inspect.currentframe()))[0]
if cmd_subfolder not in sys.path:
     sys.path.insert(0, cmd_subfolder)

有没有办法只使用 python 的导入系统而不是其他手动使用的方法来做到这一点,例如 sys.path 或其他模块,如 os、inspect 等?

如何导入模块而不关心它们导入的模块?

【问题讨论】:

    标签: python-3.x


    【解决方案1】:

    你可以运行subsubmodule.py

    python3 -m submodule.subsubmodules.subsubmodule 
    

    如果您想以更短的方式调用它,您可以在包的顶层随意添加一个 shell 或 Python 脚本。

    这就是 Python 3 中导入的工作方式; there are reasons for that.

    【讨论】:

      【解决方案2】:

      您可以通过在程序中使用sys.path 来避免此问题。

      sys.path.insert(0, './lib')
      import subsubmodule
      

      对于此代码,您可以将所有导入放到 lib 文件夹中。

      您可以阅读official documentation on Python packages,其中对此进行了深入解释。

      【讨论】:

        猜你喜欢
        • 2020-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多