类别|上一节(3.4模块)|下一节(3.6设计讨论)3.5主模块本节介绍主程序(主模块)的概念。在许多编程语言中,主函数都存在主函数或主方法的概念。//c/c++intmain(intargc,char*argv[]){...}//javaclassmyprog{publicstaticvoidmain(Stringargs[]){...}}这是启动应用程序时执行的第一个函数。Python主模块Python没有主函数(mainfunction)或主方法(mainmethod)。相反,Python有一个主模块(mainmodule)。主模块是第一个运行的源文件。bash%python3prog.py...在应用程序启动时提供给解释器的任何文件都将成为主模块。名字并不重要。__main__check对于作为主脚本运行的模块,使用此约定是标准做法。#prog.py...if__name__=='__main__':#Runningasthemainprogram...statements...if里面的语句称为主程序。主程序和库导入任何Python文件都可以作为主程序运行,也可以作为库(译注:library,在Python中library既可以指module模块也可以指package包),导入后运行。bash%python3prog.py#Runningasmainimportprog#Runningaslibraryimport在这两种情况下,__name__都是模块的名称(译注:prog)。但是,如果作为主程序运行,__name__只能设置为__main__。通常,我们不希望在导入库时执行主程序中的语句。因此,通常在代码中包含一个if-检查来判断当前文件是否是主程序if__name__=='__main__':#Doesnotexecuteifloadedwithimport...ProgramTemplates这里是一个通用的模板用于编写Python程序:#prog.py#导入语句(库)导入模块#Functionsdefspam():...defblah():...#Mainfunctiondefmain():...if__name__=='__main__':main()命令行工具Python常用的命令行工具有:bash%python3report。pyportfolio.csvprices.csv这意味着脚本在shell或终端中执行。通常用于自动化、后台任务等。命令行参数命令行参数是文本字符串列表。bash%python3report.pyportfolio.csvprices.csv这个文本字符串列表可以在sys.argv中找到。#在前面的bash命令中sys.argv#['report.py,'portfolio.csv','prices.csv']下面是一个处理参数的简单例子:importsysiflen(sys.argv)!=3:raiseSystemExit(f'Usage:{sys.argv[0]}''portfilepricefile')portfile=sys.argv[1]pricefile=sys.argv[2]...标准I/O标准输入/输出(或stdio)以与普通文件相同的方式工作的文件。sys.stdoutsys.stderrsys.stdin默认情况下,打印定向到sys.stdout文件。从sys.stdin文件中读取输入。回溯和错误被定向到sys.stderr文件。请注意,标准输入/输出(stdio)可以连接到终端、文件、管道等。bash%python3prog.py>results.txt#orbash%cmd1|python3程序.py|cmd2环境变量环境变量在shell中设置。bash%setenvNAMEdavebash%setenvRSHsshbash%python3prog.pyos.environ是一个包含这些值的字典。importosname=os.environ['NAME']#'dave'更改反映在程序随后启动的任何子进程中。程序退出通过异常处理程序退出。raiseSystemExitraiseSystemExit(exitcode)raiseSystemExit('Informativemessage')其他方式。importsyssys.exit(exitcode)非零(非零)退出代码表示错误。#!在Unix系统上,#!line指定某个路径下的Python解释器执行脚本(译注:#!叫bang)。将以下内容添加到脚本文件的第一行。#!/usr/bin/envpython3#prog.py...Python3解释器执行脚本)执行脚本需要脚本有可执行权限。bash%chmod+xprog.py#然后你可以执行bash%prog.py...输出...注意:Windows系统上的Python启动器也会查找#!行来指示语言版本。脚本模板最后,这是一个通用代码模板,用于将Python程序作为命令行脚本运行:#!/usr/bin/envpython3#prog.py#Importstatements(libraries)importmodules#Functionsdefspam():。..defblah():...#Mainfunctiondefmain(argv):#Parsecommandlineargs,environment,etc....if__name__=='__main__':importsysmain(sys.argv)Exercise练习3.15:main()函数向report.py文件添加一个main()函数,该文件采用命令行选项列表并产生与以前相同的输出。修改后,您应该能够像这样交互式地运行它:>>>importreport>>>report.main(['report.py','Data/portfolio.csv','Data/prices.csv'])NameSharesPriceChange------------------------------------------AA1009.22-22.98IBM50106.2815.18CAT15035.46-47.98MSFT20020.89-30.34GE9513.48-26.89MSFT5020.89-44.21IBM100106.2835.84>>>请修改pcost.py文件并添加类似的main()函数。>>>importpcost>>>pcost.main(['pcost.py','Data/portfolio.csv'])总成本:44671.15>>>练习3.16:写一个脚本,请修改report.py和pcost.py程序,以便它们可以作为脚本在命令行上执行:bash$python3report.pyData/portfolio.csvData/prices.csvNameSharesPriceChange---------------------------------------AA1009.22-22.98IBM50106.2815.18CAT15035.46-47.98MSFT20020.89-30.34GE9513.48-26.89MSFT5020.89-44.21IBM100106.2835.84bash$python3pcost.pyData/portfolio.csv总成本:44671.15目录|上一节(3.4模块)|下一节(3.6设计讨论)注意:完整翻译请参见https://github.com/codists/practical-python-zh
