【问题标题】:How to import a module in Python in a file that is both used as a __main__ and is imported by a file in a different directory?如何将 Python 中的模块导入到既用作 __main__ 又由不同目录中的文件导入的文件中?
【发布时间】:2017-08-02 12:14:42
【问题描述】:

假设我使用的是 Python 3(因此是绝对导入),我的目录结构如下所示:

> package:
    > sub_directory
        __init__.py
        sub_dir_file.py
        sub_dir_file2.py
    __init__.py
    main_dir_file.py

在文件sub_dir_file.py 中,我希望从sub_dir_file2.py 导入一个函数。问题是,我希望能够使用__name__ == '__main__' 运行sub_dir_file.py以及 将其导入main_dir_file.py。因此,如果在 sub_dir_file.py 我使用相对导入:

from .sub_dir_file2 import some_function

main_dir_file.py 运行时,模块执行得非常好,但直接执行时会抛出错误(因为在__name__ == '__main__' 时无法执行相对导入。但是,如果我使用普通的绝对导入,sub_dir_file.py 将执行为一个 main,但不能从 main_dir_file.py 导入。

解决这个问题的最优雅的方法是什么?一个明显的解决方案似乎是:

if __name__ == '__main__':
    from sub_dir_file2 import some_function
else:
    from .sub_dir_file2 import some_function

但是,它似乎不是很pythonic。

【问题讨论】:

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


    【解决方案1】:

    您应该使用相对导入语法 from .sub_dir_file2 import some_function 或最终使用绝对语法 from package.sub_directory.sub_dir_file2 import some_function

    然后,为了调用其中一个包子模块,使用python解释器的-m option将其内容作为__main__模块执行会更简单。

    在 sys.path 中搜索命名模块并将其内容作为 模块。

    因为参数是模块名,所以不能给文件 扩展名 (.py)。模块名称应该是有效的绝对 Python 模块名称,但实现可能并不总是强制执行此操作(例如 它可能允许您使用包含连字符的名称)。

    例如:

    > python -m package.main_dir_file
    > python -m package.sub_directory.sub_dir_file
    

    【讨论】:

      【解决方案2】:

      如果名称为__main__,我建议使用main() 函数。反正这是一个好习惯,据我所知。

      这样你就可以自己调用导入模块的main()。它还有其他好处,比如允许您测试或重新调用模块,而不必每次都执行文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-19
        • 2017-10-04
        相关资源
        最近更新 更多