Java,C,C++和C#中的Main方法的Python等价物是什么?



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

简单脚本

基本上,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 打包。关键是入口点是指hibye模块的主要功能。同样,可以指定'gui_scripts'

接下来的步骤应该在虚拟环境中使用。

现在可以通过运行以下命令来安装软件包:

$ python setup.py install

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

$ 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 脚本。

C main

函数的 Python 等价物可以称为 main 模块。

通常你有一个模块,你从Python开始,例如:

python main.py

启动此模块时,将执行模块级别上的所有编码。此编码等效于 C 中的 main 函数。所以你没有一个主函数,而是一个主模块(你可以随心所欲地命名(。

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

if __name__ == '__main__':
   main()
在主模块中

(最好在末尾(并在模块中定义主函数。if 语句是为了防止在模块未用作主模块(从其他模块导入(时执行代码。

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

引用这个线程:

if __name__ == "__main__"是运行脚本时运行的部分 从(说(命令行使用类似 python myscript.py 的命令.

我不会说这是完全相同的事情。但是,它是相似的,但不是强制性的。

示例代码:

def FunctionToRunProgram:
    # Do amazing things
if __name__ == "__main__":
    FunctionToRunProgram()

如果您在终端中运行python DoAmazingThings.py时调用了该程序的名称 DoAmazingThings.py,或者您决定使用的任何名称,它将始终以该if语句下的函数开头。

你导入sys . sys.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

这是完整的代码:

def main():
    # Your code...
if __name__ == '__main__':
    main()

相关内容

  • 没有找到相关文章

最新更新