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 打包。关键是入口点是指hi
和bye
模块的主要功能。同样,可以指定'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 种运行hi
和bye
的方法:
通过直接调用文件:
$ python hi.py
从任何使用入口点的地方:
$ hi
从任何地方使用该setuptools
scripts
:
$ hi.py
请注意,scripts
也可能指非 python 脚本。
函数的 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()