写点什么

翻译:《实用的 Python 编程》03_05_Main_module

用户头像
codists
关注
发布于: 2021 年 03 月 04 日
翻译:《实用的Python编程》03_05_Main_module

目录 | [上一节 (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 sys
if 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 os
name = 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.pypcost.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.84
bash $ python3 pcost.py Data/portfolio.csvTotal cost: 44671.15
复制代码

目录 | [上一节 (3.4 模块)]| [下一节 (3.6 设计讨论)]

注:完整翻译见 https://github.com/codists/practical-python-zh


发布于: 2021 年 03 月 04 日阅读数: 16
用户头像

codists

关注

公众号:编程人 2021.01.14 加入

Life is short, You need Python

评论

发布
暂无评论
翻译:《实用的Python编程》03_05_Main_module