繁体   English   中英

如何在Python中将模块导入一个既用作__main__又被另一个目录中的文件导入的文件?

[英]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 3(因此是绝对导入),并且我的目录结构如下所示:

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

我希望在文件sub_dir_file.pysub_dir_file2.py导入一个函数。 问题是,我希望能够使用__name__ == '__main__' sub_dir_file.py __name__ == '__main__'运行sub_dir_file.py__name__ == '__main__' 导入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。

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

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

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

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

在sys.path中搜索指定的模块,并将其内容作为模块执行。

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

例如:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM