禁止脚本导入的原因是什么(如果有的话)?

时间:2018-03-12 11:02:02

标签: python python-import

可执行脚本通常如下所示:

import modules
define some CONSTANTS, Classes, functions
if __name__ == "__main__":
    really_do_something()

最近我看到一个脚本使用了这个惯用语的否定形式:

if __name__ != "__main__":
    print('The executable must not be imported.')
    sys.exit(1)

我发现它不是Pythonic。为什么有人想阻止同意成人导入文件?有正当理由吗?

我找不到任何理由,除了在脚本顶部写这个!=守卫比在脚本底部附近的标准==守卫更简单。

即使答案看起来很明显,考虑到Python导入系统的复杂性,我决定要求确定。

2 个答案:

答案 0 :(得分:2)

考虑脚本执行立即操作的可能性。也就是说,在"模块范围内有命令"在脚本文件中:

#!/usr/bin/env python3
with open('/etc/passwd') as pwd:
    ...

在这种情况下,导入文件将导致运行这些命令。虽然它可能提供一些子程序或类定义,但它可能不会。

所以发出警告说#34;你导入了这个,但是你不应该这样做,因为它不会做你想做的事情"是一件友善的事情。它真的说"这个文件没有设置为导入。如果您需要此功能,请致电system"

答案 1 :(得分:0)

这取决于。如果脚本只是一个快速而肮脏的脚本来做一些简单的事情,那么我没有看到任何导入它的点。只需将您需要的内容复制并粘贴到您的代码中即可完成(显然我是假设兼容的开源许可证)。

如果脚本是某些库/软件的一部分,那么最佳做法是每个脚本应采用以下形式:

import argparse
from somewhere import main

args = <parse-arguments>

main(args)

换句话说:它不包含任何,它只是导入东西,解析命令行参数并调用main函数。在这种情况下导入此脚本没有意义,因为它是空的。您可以自己执行导入,删除解析内容的参数。

这就是这样一个后卫可能有用的地方。由于导入脚本没有任何逻辑上的感觉,也许你可以告诉用户,他们应该只导入main函数而不是导入脚本。

但是,如果脚本很复杂,导入东西,定义类,函数,粘合在一起等等,那么是的,导入它是有意义的,在这种情况下使用类似于您提供的保护作为示例限制了脚本的有用性。

但请注意,脚本可能包含在定义模块时执行的某些逻辑,在这种情况下导入它可能是无用的(但是应该重构脚本以将此类逻辑放置在可以安全导入的功能中)。