运行脚本时不运行main()函数

时间:2013-03-16 07:07:06

标签: python

#! /usr/bin/python

def main():
    print("boo")

当我尝试在Python 3.3中运行它时,此代码不执行任何操作。没有错误或任何事情。 什么是错的

[tim@tim-arch ~]$ gvim script
[tim@tim-arch ~]$ sudo chmod 775 script
[tim@tim-arch ~]$ ./script
[tim@tim-arch ~]$ 

5 个答案:

答案 0 :(得分:28)

您仍然必须调用该功能。

def main():  # declaring a function just declares it - the code doesn't run
    print("boo")

main()  # here we call the function

答案 1 :(得分:14)

我假设你想要做的是从命令行执行脚本时调用print函数。

在python中,您可以通过检查__name__变量__main__来确定包含一段代码的脚本是否与最初启动的脚本相同。

#! /usr/bin/python

if __name__ == '__main__':
    print("boo")

只需这些代码:

def main():
    print("boo")

你正在定义一个函数而不是实际调用它。要调用函数main(),您需要像这样调用它:

main()

答案 2 :(得分:4)

您需要调用该函数,将脚本更新为

#! /usr/bin/python

def main():
    print("boo")

#call it
main()

答案 3 :(得分:3)

在python中,如果你想编写一个脚本来执行顺序的一系列小任务,那么绝对没有需要编写一个函数来包含它们。把它们放在一条线上;或者使用像;这样的表达分隔符(不是真的推荐,但是你可以做到就是这样的愿望),同样:

task1
task2
task3
task4

task1; task2; task3; (again **not** really recommended, and certainly not pythonic)

在您的情况下,您的代码可以转为:

print('boo')
print('boo2')
print('boo3')

并且在没有main()方法的情况下它仍将按预期运行,因为它们会按顺序进行评估。

请注意,您可能希望为这一系列任务创建函数的原因是:

  • 提供一个很好的界面(代码的客户端),
  • 或封装重复逻辑
  • 可能会有更多用途,但这是我能提出的第一个用途,并证明了我的观点。

现在,如果你觉得有必要在其他编程语言中编写类似于main()方法的代码,那么请使用下面的python习惯用法(如其他用户所述):

if __name__ == '__main__':
    doSomething()

以上工作原理如下:

  • 当你import一个python模块时,它会获得一个string(通常是导入它的名称)作为其__name__属性。
  • 当您直接执行脚本时(通过调用python vm并将脚本的名称作为参数传递),__name__属性设置为__main__
  • 因此,当您使用上述习语时,您可以通过import随意使用该脚本作为可插拔模块,直接执行它以获得一系列表达式在if __name__ == '__main__':下直接评估。

如果您觉得需要深入了解更多信息,我的消息来源如下:

答案 4 :(得分:1)

如果你发现其他答案令人困惑或恐惧,那么这就是一个有希望帮助的寓言。查看以下Python程序:

a = 34

当它运行时,它会在退出脚本之前执行某些事情:,Python会知道存在变量a并且它的值是整数34.它没有&#t; t 任何有关此信息的内容,但它是一个完整的程序,可以某些东西。为了产生一些实际价值,它需要与其环境互动,虽然。它对这个值有什么作用?它可以创建34个目录,或ping数据中心的第34个服务器,或检查数据库中最新34个用户的密码强度,或者其他任何内容;或者只打印一些东西。

a = 34
print(a)

以下程序在某种意义上与第一个程序非常相似。

def b():
    a = 34
    print(a)

当你运行这个程序时,它会做的东西: Python现在知道有一个名为b的函数,并且它没有接受任何参数,并且它包含一些语法上有效的Python代码,这些代码将在其他代码调用时运行,但它实际上 实际上没有使用此代码。为了观察函数中代码产生的任何值,你必须实际调用它:

b()

(另外,也可以注意到函数声明a中的局部变量b与具有相同名称的全局变量不同。)