导入函数时是否会运行整个脚本?

8 投票
2 回答
7911 浏览
提问于 2025-04-21 02:27

我刚开始学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

撰写回答