导入函数时,它运行整个脚本?

时间:2014-09-11 13:02:24

标签: python windows

我是python的新手,正在做作业。这是用linux完成的,但是我自己在自己的计算机上做这件事我在windows上做。

我一直在尝试使用这样的测试系统:

>>> import file
>>> file.function(x)
"Answer that we want"

然后我们通过linux终端运行它。我一直试图通过创建一个导入文件并运行该函数的测试文件来创建自己的方法。但是另一方面,在运行该函数的另一方面,它运行整个脚本。即使它从未被要求这样做。

Import file
file.function(x)

这就是我一直在做的事情,但它运行整个“文件”。我也试过From File Import函数;它也是这样。

我可以使用哪种脚本来编写测试文件的“我想要的答案”?当我们通过linux终端运行时,它会说它是否失败或得分。

2 个答案:

答案 0 :(得分:9)

import文件相当于运行它。

当你import一个文件(模块)时,会创建一个新的模块对象,并且在执行模块时,每个新的标识符都作为属性放入对象中。

因此,如果您不希望模块在导入时执行任何操作,请重写它以使其仅具有分配和函数定义。

如果您希望它仅在直接调用时运行某些内容,您可以执行

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

答案 1 :(得分:2)

您可以使用__name__属性检查模块是导入还是执行。如果执行脚本,则属性为'__main__'

定义包含应该执行的代码的主函数也是一种好方法。

def main()
    # do something
    pass

if __name__ == '__main__'
    main()