![](/img/trans.png)
[英]Python: How to import module that is in the same directory as __main__ to third-party module?
[英]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.py
从sub_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.