2017-08-02 78 views
1

说我使用Python 3(因此绝对进口)和我的目录结构是这样的:如何在Python中将模块导入同时用作__main__并由不同目录中的文件导入的文件中?

> 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 

模块执行从main_dir_file.py运行时完全没有问题,但将引发时直接执行一个错误(作为相对进口不能被执行时__name__ == '__main__'如果我然而使用?正常的绝对导入,sub_dir_file.py将执行为主,但不能从main_dir_file.py进口

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

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

然而,它似乎并不pythonic。

回答

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 
1

如果名字是__main__,我会建议使用main()函数。无论如何,就我所知,这是一个很好的习惯。

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

相关问题