【问题标题】:After breaking a python program into functions, how do I make one the main function?将python程序分解为函数后,如何使一个成为主要函数?
【发布时间】:2010-01-24 03:42:27
【问题描述】:

这是这个星球上最大的新手问题,但我不确定。我编写了一堆执行某些任务的函数,我想要一个“主”函数,例如,当我调用“someProgram.py”时,运行函数 1、函数 2 并退出。我依稀记得一些关于“ma​​in”的内容,但我不知道。

【问题讨论】:

  • +1 这是一个很棒的新手问题!

标签: python


【解决方案1】:

Python 脚本不是函数的集合,而是语句的集合 - 函数和类定义只是将名称绑定到函数或类对象的语句。

如果您在程序的顶部或中间放置一条打印语句,它将正常运行而无需在任何函数中。这意味着您可以将所有主要代码放在文件末尾,它会在脚本运行时运行。但是,如果您的脚本曾经被导入而不是直接运行,那么该代码也会运行。这通常不是您想要的,因此您希望避免这种情况。

Python 提供了__name__ 全局变量来区分脚本何时被导入并直接运行——它被设置为脚本运行的名称。如果脚本被导入,它将是脚本文件的名称。如果直接运行,它将是"__main__"。因此,您可以在程序底部放置一个if __name__ == '__main__':,并且此 if 块中的所有内容只有在脚本直接运行时才会运行。

示例。

if __name__ == "__main__":
    the_function_I_think_of_as_main()

【讨论】:

  • +1。 __name__ 实际上是“当前”模块的名称,它可以方便地为__main__ 工作(我敢肯定,这不是偶然的)(这是特殊的,但仍然是一个模块)。这很方便与日志记录或stackoverflow.com/questions/2000861/… 结合使用
【解决方案2】:

第一次导入 python 模块时,它的主块运行。您可以区分是自己运行还是导入到另一个程序中:

if __name__ == "__main__":
    function1()
    function2()
else:
    # loaded from another module

【讨论】:

    【解决方案3】:
    if __name__ == '__main__':
      run_main()
    

    【讨论】:

    • 这并没有真正回答所写的问题,而是在回答“导入模块时如何让我的主要功能不运行?”。如果您已经有一个run_main 函数,那么您需要做的就是调用它。 Max S 的回答对我来说更可取。
    【解决方案4】:

    是这样的成语:

    if __name__ == "__main__":
       yourfoo()
    

    Also read this.

    【讨论】:

      【解决方案5】:

      当我阅读您的问题时,您正在询问如何定义主要功能。这实际上可以通过以下方式完成:

      def main():
          function1()
          function2()
          return 0
      

      然后你会在你的所有主文件的函数之外放置类似这样的代码:

      if __name__ == "__main__":
          sys.exit(main())
      

      (当然,您需要在某处导入系统才能使上述工作。)

      一个(现在有点旧,但仍然相关)post from Guido 告诉更多。

      【讨论】:

      • return 0 ?这是 Python,不是 C :)。
      • 有什么问题?它不会导致错误,并告诉操作系统您退出时没有失败,因此至少在某些圈子中被认为是良好的做法。
      • 对不起,你是对的。我没有在sys.exit 的上下文中阅读它。
      • sys.exit 将 None (main 默认返回)视为 0;该 return 语句仍然没有理由,但是 +1 是提及 sys.exit 的重要用途的唯一答案。您还可以返回一个字符串作为快速而肮脏的错误报告机制(sys.exit 将打印它并向操作系统提供非零退出代码)。
      猜你喜欢
      • 1970-01-01
      • 2014-11-08
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      • 2021-12-09
      • 2015-11-04
      • 2010-11-26
      • 2022-11-21
      相关资源
      最近更新 更多