【问题标题】:what is the Python equivalent of the Main method in Java, C, C++ & C#?Java、C、C++ 和 C# 中 Main 方法的 Python 等效项是什么?
【发布时间】:2015-04-25 03:43:43
【问题描述】:

Python 新手,来自 Java (& Android) & C,C++,C# 背景。基本上是在寻找相似之处。 python项目的入口点是什么?就像其他语言中的 Main 方法一样。 一个有多个.py脚本的项目,如何设置入口点?

【问题讨论】:

  • 显然没什么,这就是我们喜欢 python 的原因,只需输入 print 5+6 即可完成第一个程序

标签: python main entry-point


【解决方案1】:

C 主函数的 Python 等效项可以称为主模块。

通常你有一个模块,你用 Python 启动,例如:

python main.py

当您启动此模块时,将执行模块级别的所有编码。这种编码相当于C中的main函数。所以你没有main函数,而是一个main模块(你可以随意命名)。

如果你想有一个主函数,只需添加:

if __name__ == '__main__':
   main()

在你的主模块中(最好在最后)并在你的模块中定义主函数。 if 语句是为了阻止代码的执行,当模块不用作主模块时(它是从不同的模块导入的)。

但是,您必须注意一件事:在 C 中,只有 main 函数是 通过启动程序隐式调用。 Python 完全是 不同的。中使用的所有模块的所有模块级编码 程序在程序开始时执行。

【讨论】:

  • 我现在明白你的意思了,谢谢你帮助我理解它。
【解决方案2】:

引用this线程:

if __name__ == "__main__"是脚本运行时运行的部分 从(比如说)命令行使用像python myscript.py这样的命令。

我不会说这完全一样。然而它是相似的,但不是强制性的。

示例代码:

def FunctionToRunProgram:
    # Do amazing things

if __name__ == "__main__":
    FunctionToRunProgram()

如果当您在终端中运行 python DoAmazingThings.py 或任何您决定使用的程序时,该程序的名称被称为 DoAmazingThings.py,它将始终以 if 下的函数开头声明。

【讨论】:

  • 这是正确的,但您还应该提供信息,即 if 语句之外的模块中的任何其他代码也将运行。
  • 我不知道你的评论@Juergen是什么意思。
  • 你知道 Python,我猜?当你有 C 时,只有 main 函数中的代码会被执行——而其他的一切都必须从那里调用。 Python 是不同的。您的帖子仅提供了一个示例,但并未反映差异。
【解决方案3】:

这是完整的代码:

def main():
    # Your code...

if __name__ == '__main__':
    main()

【讨论】:

    【解决方案4】:

    简单脚本

    基本上,Python 模块中的代码只是运行。对于一个非常简单的程序,您可以创建一个 Python 文件 hi.py,其内容如下:

    print('Hi ' + raw_input('What is your name?\n'))
    

    这可以使用:

    $ python hi.py
    What is your name?
    Remco
    Hi Remco
    

    使其可执行

    在支持此功能的系统中,您可以添加 shebang 并使文件可执行。 hi.py 现在看起来像这样:

    #!/usr/bin/env python
    print('Hi ' + raw_input('What is your name?\n'))
    

    然后从终端运行

    $ chmod +x hi.py
    $ ./hi.py
    What is your name?
    Remco
    Hi Remco
    

    __main__

    您可能希望拆分逻辑,以便在其他模块中也可以使用它。在这种情况下,您不想运行模块中的所有代码。运行的主模块名为__main__。这通常用于一个简单的脚本。

    hi.py:

    #!/usr/bin/env python
    def get_name():
        return raw_input('What is your name?\n')
    
    
    if __name__ == '__main__':
        print('Hi ' + get_name())
    

    bye.py:

    #!/usr/bin/env python
    import hi
    
    
    if __name__ == '__main__':
        print('Bye ' + hi.get_name())
    

    入口点

    这个项目现在变得严肃起来。它应该被正确打包,以便其他人可以分发和安装。为此,必须创建 setup.py。 该项目现在具有以下文件结构:

    |- bye.py
    |- hi.py
    `- setup.py
    

    入口点是函数,所以我们需要将主要功能放在函数中。让我们将这两个函数命名为main

    hi.py:

    #!/usr/bin/env python
    def get_name():
        return raw_input('What is your name?\n')
    
    
    def main():
        print('Hi ' + get_name())
    

    bye.py:

    #!/usr/bin/env python
    import hi
    
    
    def main()
        print('Bye ' + hi.get_name())
    

    setup.py:

    #!/usr/bin/env python
    from setuptools import setup
    
    
    setup(
        name='greeter',
        version='0.0.0',
        py_modules=['hi', 'bye'],
        entry_points={
            'console_scripts': [
                'hi = hi:main',
                'bye = bye:main'
            ]
        })
    

    我不会详细介绍 python 打包。重点是entry points 指的是hibye 模块的主要功能。同样可以指定'gui_scripts'

    以下步骤应在virtualenv 中使用。

    现在可以通过运行安装包:

    $ python setup.py install
    

    您现在可以简单地从命令行访问主函数:

    $ hi
    What is your name?
    Remco
    Hi Remco
    

    这通常是您在创建要分发的包时使用的。

    scripts

    另一种方法是在setup.py 中指定scripts。这允许像开始一样将 Python 脚本作为常规脚本运行。要实现这一点,只需从该文件中运行 main 函数并将其指定为 setup.py 中的脚本。

    hi.py:

    #!/usr/bin/env python
    def get_name():
        return raw_input('What is your name?\n')
    
    
    def main():
        print('Hi ' + get_name())
    
    
    if __name__ == '__main__':
        main()
    

    bye.py: #!/usr/bin/env python 进口喜

    def main():
        print('Bye ' + hi.get_name())
    
    
    if __name__ == '__main__':
        main()
    

    setup.py:

    #!/usr/bin/env python
    from setuptools import setup
    
    
    setup(
        name='greeter',
        version='0.0.0',
        py_modules=['hi', 'bye'],
        entry_points={
            'console_scripts': [
                'hi = hi:main',
                'bye = bye:main'
            ]
        },
        scripts=['hi.py', 'bye.py'])
    

    重新安装软件包。现在有 3 种方式运行 hibye

    直接调用文件:

    $ python hi.py
    

    从任何地方使用入口点:

    $ hi
    

    从任何地方使用setuptools scripts

    $ hi.py
    

    请注意,scripts 也可能指非 Python 脚本。

    【讨论】:

      【解决方案5】:

      您导入syssys.argv 包含参数,就像在 C 和 C++ 中一样,第一个参数是程序的名称。它不完全像 C 等,因为没有自动的“主”入口点。

      import sys
      
      def main(argc, argv):
          print('argc: %i' % argc)
          print('argv: %s' % argv)
      
      if __name__ == "__main__":
          main(len(sys.argv), sys.argv)
      

      例如,如果文件名为“test.py”,则调用python test.py arguments -v --version "file" 33 将打印:

      argc: 6
      argv: ['test.py', 'arguments', '-v', '--version', 'file', '33']
      

      文档可以在这里找到:https://docs.python.org/3.6/library/sys.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-02
        • 2016-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-25
        • 1970-01-01
        相关资源
        最近更新 更多