导入函数时是否会运行整个脚本?
我刚开始学Python,正在做一个作业。这个作业本来是要在Linux上完成的,但因为我自己在个人电脑上做,所以我用的是Windows。
我一直在尝试创建一个测试系统,想让它看起来像这样:
>>> import file
>>> file.function(x)
"Answer that we want"
然后我们通过Linux终端来运行它。我试着自己找个方法,创建一个测试文件,导入这个文件并运行其中的函数。但是,问题是,当我只想运行这个函数时,它却会运行整个脚本。尽管我并没有调用它去做这个。
Import file
file.function(x)
这基本上就是我所做的,但它还是会运行整个“文件”。我也试过用 from file import function
,结果也是一样。
我可以用什么样的脚本来编写“我想要的答案”给测试文件呢?因为当我们在Linux终端运行时,它会告诉我们是否失败或者得分。
2 个回答
5
你可以通过 __name__
这个属性来检查模块是被导入还是直接执行。如果脚本是被直接执行的,那么这个属性的值就是 '__main__'
。
另外,定义一个主函数来放置需要执行的代码也是一种很好的编程习惯。
def main()
# do something
pass
if __name__ == '__main__'
main()
15
导入一个文件就相当于运行它。
当你导入一个文件(模块)时,会创建一个新的模块对象,并在执行这个模块时,所有新的标识符(比如变量和函数)都会作为属性放到这个对象里。
所以,如果你不想让模块在导入时做任何事情,可以把它改写成只包含赋值和函数定义的内容。
如果你想让它只在直接调用时运行某些东西,可以这样做:
A = whatever
def b():
...
if __name__ == '__main__'
# write code to be executed only on direct execution, but not on import
# This is because direct execution assigns `'__main__'` to `__name__` while import of any way assigns the name under which it is imported.
无论你是用 import module
还是 from module import function
,效果都是一样的。唯一不同的是最后的赋值:
import module
做了以下事情:
- 检查
sys.modules
,如果模块名不在里面,就导入它。 - 把标识符
module
赋值给模块对象。
from module import function
做的事情是:
- 同样检查
sys.modules
,如果模块名不在里面,就导入它。(这一步和上面是一样的)。 - 把标识符
function
赋值给模块对象的属性function
。