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

Python 禁止脚本导入的原因(如果有)是什么?,python,python-import,Python,Python Import,可执行脚本通常如下所示: import modules define some CONSTANTS, Classes, functions if __name__ == "__main__": really_do_something() 最近我看到一个脚本使用了Common成语的否定形式: if __name__ != "__main__": print('The executable must not be imported.') sys.exit(1) 我觉得这不

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

import modules
define some CONSTANTS, Classes, functions
if __name__ == "__main__":
    really_do_something()
最近我看到一个脚本使用了Common成语的否定形式:

if __name__ != "__main__":
    print('The executable must not be imported.')
    sys.exit(1)
我觉得这不是蟒蛇式的。为什么有人要阻止成年人同意导入该文件?是否有正当理由

我找不到任何理由,除了写这个
更简单==
保护相比,代码>保护位于脚本顶部


即使答案看起来很明显,但考虑到Python导入系统的复杂性,我还是决定问一下,这要看情况而定。如果这个脚本只是一个快速而肮脏的脚本来做一些简单的事情,那么我认为导入它没有任何意义。只要将所需内容复制并粘贴到代码中,就完成了(显然,我假设有一个兼容的开源许可证)

如果脚本是某些库/软件的一部分,那么最佳做法是每个脚本的格式应为:

import argparse
from somewhere import main

args = <parse-arguments>

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

这就是这样一个守卫可能有用的地方。由于导入脚本没有任何逻辑意义,因此您可以告诉用户,与其导入脚本,不如直接导入
main
函数

但是,如果脚本很复杂,需要导入内容、定义类、函数、将各个部分粘在一起等等,那么导入脚本是有意义的,在这种情况下,使用类似于您作为示例提供的保护会限制脚本的用途


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

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

如果脚本是某些库/软件的一部分,那么最佳做法是每个脚本的格式应为:

import argparse
from somewhere import main

args = <parse-arguments>

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

这就是这样一个守卫可能有用的地方。由于导入脚本没有任何逻辑意义,因此您可以告诉用户,与其导入脚本,不如直接导入
main
函数

但是,如果脚本很复杂,需要导入内容、定义类、函数、将各个部分粘在一起等等,那么导入脚本是有意义的,在这种情况下,使用类似于您作为示例提供的保护会限制脚本的用途


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

考虑脚本执行即时操作的可能性。也就是说,脚本文件中的“模块范围”中有以下命令:

#!/usr/bin/env python3
with open('/etc/passwd') as pwd:
    ...
在这种情况下,导入文件将导致运行这些命令。虽然它可能提供一些子例程或类定义,但它可能不提供


所以写上一句警告“你导入了这个,但你不应该,因为它不会做你想要的”是一件友好的事情。它实际上是说“此文件未设置为导入。如果需要此功能,请调用
system

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

#!/usr/bin/env python3
with open('/etc/passwd') as pwd:
    ...
在这种情况下,导入文件将导致运行这些命令。虽然它可能提供一些子例程或类定义,但它可能不提供


所以写上一句警告“你导入了这个,但你不应该,因为它不会做你想要的”是一件友好的事情。它实际上是说“此文件未设置为导入。如果需要此功能,请调用
系统

脚本特别希望在命令行环境中执行,作者发现用这种方式显式处理它比预期其他用例更容易…?脚本特别希望在命令行环境中执行,作者发现用这种方式显式处理它比预期更容易其他一些用例…?我认为这与我在问题中概述的情况相同:所有操作都应该在
if\uuuuu name\uuuu==“\uuuu main\uuuu”
行下进行,但不支持导入更简单。无论如何,我很高兴没有发现其他原因。我认为这与我在问题中概述的情况是一样的:所有操作都应该在
if\uuuu name\uuuu==“\uu main\uuuu”
行下进行,但不支持导入更简单。无论如何,我很高兴没有发现其他原因。很抱歉,我不理解这一部分“因为导入脚本没有任何逻辑意义,也许你可以告诉用户,与其导入脚本,不如直接导入主函数。”我认为这是不可能的。@VPfB什么是不可能的?阻止脚本导入?这就是您的示例代码所做的,所以这是可能的。乱七八糟