可执行脚本通常如下所示:
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)我发现它不是毕达克。为什么有人要阻止成年人同意导入文件?有合理的理由吗?
我找不到任何理由,只是在脚本顶部编写这个!=保护比脚本底部附近的标准==保护更简单。
即使答案看起来很明显,考虑到Python导入系统的复杂性,我还是决定问一问是否确定。
发布于 2018-03-12 13:49:18
考虑脚本执行即时操作的可能性。也就是说,脚本文件中有位于“模块作用域”的命令:
#!/usr/bin/env python3
with open('/etc/passwd') as pwd:
...在这种情况下,导入文件将导致运行这些命令。虽然它可能提供一些子程序或类定义,但它可能没有。
所以,提出一个警告,说“你进口了这个,但你不应该,因为它不会做你想做的”是一件友好的事情。它真的说“这个文件不是要导入的。如果您想要这个功能,请调用system”。
发布于 2018-03-12 13:16:08
那得看情况。如果这个脚本只是一个快速而肮脏的脚本来做一些简单的事情,那么我认为导入它没有任何意义。只需将所需内容复制并粘贴到代码中,就可以完成(显然,我假设的是兼容的开源许可)。
如果脚本是某个库/软件的一部分,那么最好的做法是每个脚本都应该具有以下形式:
import argparse
from somewhere import main
args = <parse-arguments>
main(args)换句话说:它不包含任何内容,它只是导入内容,解析命令行参数并调用main函数。在这种情况下,导入这个脚本是没有意义的,因为它是空的。您可以自己执行导入,删除参数解析内容。
这就是这样一个守卫可能有用的地方。由于导入脚本并不具有任何逻辑意义,所以您也许可以告诉用户,与其导入脚本,不如简单地导入main函数。
但是,如果脚本是复杂的,那么导入内容、定义类、函数、将片段粘合在一起等等都是有意义的,那么导入它是有意义的,在本例中,使用与您提供的类似的保护机制限制了脚本的有用性。
但是,请注意,脚本可能包含在定义模块时执行的一些逻辑,在这种情况下,导入它可能是无用的(但是,应该重构脚本,以便将这种逻辑放入可以安全导入的函数中)。
https://stackoverflow.com/questions/49233609
复制相似问题