目录 | [上一节 (3.4 模块)]() | [下一节 (3.6 设计探讨)]()
3.5 主模块
本节介绍主程序(主模块)的概念
主函数
在许多编程语言中,存在一个主函数或者主办法的概念。
// c / c++int main(int argc, char *argv[]) { ...}
// javaclass myprog { public static void main(String args[]) { ... }}
这是启动应用程序时执行的第一个函数。
Python 主模块
Python 没有主函数(main function)或主办法(main method)。相同,Python 有一个主模块(main
module)。主模块是第一个运行的源文件。
bash % python3 prog.py...
在应用程序启动时,提供给解释器的任何文件都将成为主模块。名字并不重要。
__main__
查看
对于作为主脚本运行的模块,应用此约定(译注:__main__
查看)是规范做法。
# prog.py...if __name__ == '__main__': # Running as the main program ... statements ...
在 if
外面的语句称为主程序( main program)。
主程序与库导入
任何 Python 文件都能够作为主程序运行,或者作为一个库(译注:library,在 Python 中 library 既能够指模块 module,也能够指包 package),导入后运行。
bash % python3 prog.py # Running as main
import prog # Running as library import
在这两种状况下,__name__
都是模块的名称(译注:prog)。然而,如果作为主程序运行,__name__
只能被设置为 __main__
。
通常,咱们不心愿主程序中的语句在库导入的时候执行。所以,通常在代码中蕴含一个 if-
查看,判断以后文件是否是主程序(译注:如果以后程序不是主程序,则 if __name__ == '__main__':
外面的语句不执行)。
if __name__ == '__main__': # Does not execute if loaded with import ...
程序模板
这里有一个用于编写 Python 程序的通用模板:
# prog.py# Import statements (libraries)import modules# Functionsdef spam(): ...def blah(): ...# Main functiondef main(): ...if __name__ == '__main__': main()
命令行工具
Python 通常在命令行工具中应用:
bash % python3 report.py portfolio.csv prices.csv
这意味着脚本在 shell 或者 终端(terminal)执行。通常用于自动化,后台任务等。
命令行参数
命令行参数是一个文本字符串列表。
bash % python3 report.py portfolio.csv prices.csv
该文本字符串列表能够在 sys.argv
中找到。
# In the previous bash commandsys.argv # ['report.py, 'portfolio.csv', 'prices.csv']
这里有一个解决参数的简略示例:
import sysif len(sys.argv) != 3: raise SystemExit(f'Usage: {sys.argv[0]} ' 'portfile pricefile')portfile = sys.argv[1]pricefile = sys.argv[2]...
规范 I/O
规范输出/输入(或者stdio)是和一般文件应用雷同工作形式的文件。
sys.stdoutsys.stderrsys.stdin
默认状况下,打印定向到 sys.stdout
文件。输出是从 sys.stdin
文件读取。回溯和谬误定向到 sys.stderr
文件。
请留神,规范输出/输入(stdio)能够连贯到终端(terminals),文件(files),管道(pipes)等。
bash % python3 prog.py > results.txt# orbash % cmd1 | python3 prog.py | cmd2
环境变量
环境变量在 shell 中设置。
bash % setenv NAME davebash % setenv RSH sshbash % python3 prog.py
os.environ
是蕴含这些值的字典。
import osname = os.environ['NAME'] # 'dave'
更改会反映在程序随后启动的任何子过程中。
程序退出
通过异样处理程序退出。
raise SystemExitraise SystemExit(exitcode)raise SystemExit('Informative message')
其它形式。
import syssys.exit(exitcode)
非零(non-zero )退出码示意谬误。
#!
行
在 Unix 零碎中,#!
行指定某个门路下的 Python 解释器来执行该脚本(译注:#!
称为 Shebang 或者 hashbang,因为 # 号通常称为 hash 或者 sharp,而 ! 号则经常称为 bang)。将以下内容增加到脚本文件的第一行。
#!/usr/bin/env python3# prog.py...
(译注:#!/usr/bin/env python3
的意思——到 Unix 零碎 env 所蕴含的全副环境变量中寻找 Python3 解释器,并应用 Python3 解释器执行该脚本)
执行脚本须要脚本具备可执行权限。
bash % chmod +x prog.py# Then you can executebash % prog.py... output ...
留神:Windows 零碎上的 Python 启动器也会寻找 #!
行以批示语言版本。
脚本模板
最初,这里有一个通用代码模板,用于将 Python 程序作为命令行脚本运行:
#!/usr/bin/env python3# prog.py# Import statements (libraries)import modules# Functionsdef spam(): ...def blah(): ...# Main functiondef main(argv): # Parse command line args, environment, etc. ...if __name__ == '__main__': import sys main(sys.argv)
练习
练习 3.15:main()
函数
在 report.py
文件中增加一个 main()
函数,该函数接受命令行选项列表,并生成与以前雷同的输入。批改后,应该可能像上面这样交互地运行它:
>>> import report>>> report.main(['report.py', 'Data/portfolio.csv', 'Data/prices.csv']) Name Shares Price Change---------- ---------- ---------- ---------- AA 100 9.22 -22.98 IBM 50 106.28 15.18 CAT 150 35.46 -47.98 MSFT 200 20.89 -30.34 GE 95 13.48 -26.89 MSFT 50 20.89 -44.21 IBM 100 106.28 35.84>>>
请批改 pcost.py
文件,增加一个相似的 main()
函数。
>>> import pcost>>> pcost.main(['pcost.py', 'Data/portfolio.csv'])Total cost: 44671.15>>>
练习 3.16:编写脚本
请批改 report.py
和 pcost.py
程序,以便它们在命令行上能够作为脚本执行:
bash $ python3 report.py Data/portfolio.csv Data/prices.csv Name Shares Price Change---------- ---------- ---------- ---------- AA 100 9.22 -22.98 IBM 50 106.28 15.18 CAT 150 35.46 -47.98 MSFT 200 20.89 -30.34 GE 95 13.48 -26.89 MSFT 50 20.89 -44.21 IBM 100 106.28 35.84bash $ python3 pcost.py Data/portfolio.csvTotal cost: 44671.15
目录 | [上一节 (3.4 模块)]() | [下一节 (3.6 设计探讨)]()
注:残缺翻译见 https://github.com/codists/practical-python-zh