【问题标题】:Importing from one sub-module into another sub-module从一个子模块导入另一个子模块
【发布时间】:2018-12-06 08:55:13
【问题描述】:

我正在为 python 的导入而苦苦挣扎。

我有我的 python 项目的存储库,其中包含或多或少独立的程序和工具的集合。有几个子文件夹包含单个脚本和程序;有些也可以用作其他脚本的辅助例程。假设我的文件夹结构如下:

root
   __init__.py
   prog1.py
   prog2.py
   imaging
        __init__.py
        filter1.py
        detect_edges.py
   data_tools
        __init__.py
        floating_mean.py
        unify_data_sources.py
        prog3.py

现在假设我想直接使用prog3.py,但需要调用filter1.py。如何将其导入prog3.py

我设法导入它的唯一方法是添加到需要修改 sys.path 的路径。

import sys
sys.path.append("../imaging/")
from filter1 import filter1

据我所知模块的相对定位方式,是否有另一种方式类似于 python 的模块导入指南(herehere)中描述的内容而不更改 sys.path?

【问题讨论】:

    标签: python python-3.x import


    【解决方案1】:

    假设您需要调用 filter1.py 来导入共享函数或类,我将使用 python 教程中描述的相对导入。

    filter1.py

    def some_shared_func1():
        pass
    
    def some_shared_func2(): 
        pass
    

    prog3.py

    from ..imaging.filter1 import some_shared_func1, some_shared_func2
    # filter1 is reached from prog3 by go two levels up then one level down to `imaging` folder.
    
    if __name__ == "__main__":
        # Do something with some_shared_func1
        # Do something with some_shared_func2
        pass
    

    然后我会运行带有 -m 参数的 prog3.py 来解析相对导入,但没有扩展:

    python -m root.data_tools.prog3
    

    当前目录必须是包含root 的目录(或定义到 PYTHONPATH 变量中)。

    我不修改sys.path

    这就是你要找的吗?

    【讨论】:

    • 是和不是。我调用我的程序和脚本的通常方式是来自 Spyder。当我从普通命令行运行它时,这主要解决了我的问题。然而 Spyder 允许设置我可以设置的当前目录,例如根。然而,当我从 data_tools 执行文件时,它无法找到成像功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 2020-05-18
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    相关资源
    最近更新 更多