如何在既用作 __main__ 又由不同目录中的文件导入的文件中导入 Python 中的模块?

布鲁诺公里

假设我使用的是 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. 美中不足的是,我希望能够运行sub_dir_file.py__name__ == '__main__'以及进口它main_dir_file.py因此,如果sub_dir_file.py我使用相对导入:

from .sub_dir_file2 import some_function

该模块在 run from 时执行得非常好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。

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

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

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

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

例如:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python 3-在同一目录中导入.py文件-ModuleNotFoundError:没有名为“ __main __。char”的模块;'__main__'不是一个包

Python动态导入-如何从变量中的模块名称中导入*?

如何在python文件中导入名称中带有空格的文件?

如何在python文件中导入名称中带有空格的文件?

如何在Python中获取__main__模块的文件名?

__main__和python中的作用域

使用python软件包在'<packageName>'中收到'找不到'__main__'模块

如何在Python中导入.msg文件以及本地目录中的附件

如何在不同文件中导入libs模块

Python:如何从HDFS导入目录中的文件列表

如何在带有if __name __ ='__ main__'块的Python3中使用相对导入?

是否可以创建不导入__main__模块的Python多处理子进程/工作进程?

如何在一个python文件中从多个类中导入一个类

错误:没有名为“ __main __。forms”的模块;'__main__'不是Python3中的软件包

如何在不使用相对导入的情况下从另一个目录中的Python脚本执行文件(导入其他模块)?

Python-ATBS附录B-在C:\\路径错误中找不到'__main__'模块

python在Azure Pipelines的'.py'中找不到'__main__'模块

如何在Windows中的python3中导入文件/模块?

如何在python3中使用pyclbr搜索__main__模块?

在Python 3.4中导入文件

如何从文件夹中的python文件和同一目录中的文件中导入文件?

如何让模块使用 __main__ 文件(及其配置)中的记录器?

从包中的多个模块登录无法从 __main__ 工作

如何从python中的同一目录导入文件?

如何在另一个文件目录中的另一个脚本中导入 Python 文件?

如何在“if __name__ == '__main__'”中模拟.patch 变量

如何导入 Python 模块并让它在我的主文件中工作?

如何从 Python 父目录中的包中导入模块?

如何从python中的不同目录导入模块