首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁止脚本导入的原因(如果有的话)是什么?

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

Stack Overflow用户
提问于 2018-03-12 11:02:02
回答 2查看 53关注 0票数 0

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

代码语言:javascript
复制
import modules
define some CONSTANTS, Classes, functions
if __name__ == "__main__":
    really_do_something()

最近,我看到了一个脚本,它使用的是普通成语的否定形式:

代码语言:javascript
复制
if __name__ != "__main__":
    print('The executable must not be imported.')
    sys.exit(1)

我发现它不是毕达克。为什么有人要阻止成年人同意导入文件?有合理的理由吗?

我找不到任何理由,只是在脚本顶部编写这个!=保护比脚本底部附近的标准==保护更简单。

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

EN

回答 2

Stack Overflow用户

发布于 2018-03-12 13:49:18

考虑脚本执行即时操作的可能性。也就是说,脚本文件中有位于“模块作用域”的命令:

代码语言:javascript
复制
#!/usr/bin/env python3
with open('/etc/passwd') as pwd:
    ...

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

所以,提出一个警告,说“你进口了这个,但你不应该,因为它不会做你想做的”是一件友好的事情。它真的说“这个文件不是要导入的。如果您想要这个功能,请调用system”。

票数 2
EN

Stack Overflow用户

发布于 2018-03-12 13:16:08

那得看情况。如果这个脚本只是一个快速而肮脏的脚本来做一些简单的事情,那么我认为导入它没有任何意义。只需将所需内容复制并粘贴到代码中,就可以完成(显然,我假设的是兼容的开源许可)。

如果脚本是某个库/软件的一部分,那么最好的做法是每个脚本都应该具有以下形式:

代码语言:javascript
复制
import argparse
from somewhere import main

args = <parse-arguments>

main(args)

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

这就是这样一个守卫可能有用的地方。由于导入脚本并不具有任何逻辑意义,所以您也许可以告诉用户,与其导入脚本,不如简单地导入main函数。

但是,如果脚本是复杂的,那么导入内容、定义类、函数、将片段粘合在一起等等都是有意义的,那么导入它是有意义的,在本例中,使用与您提供的类似的保护机制限制了脚本的有用性。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49233609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档