主程序介绍

PythonPythonBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本节介绍主程序或主模块的概念。

主要函数

在许多编程语言中,都有一个“主”函数或方法的概念。

// c / c++
int main(int argc, char *argv[]) {
  ...
}
// java
class myprog {
    public static void main(String args[]) {
      ...
    }
}

这是应用程序启动时执行的第一个函数。

Python 主模块

Python 没有“主”函数或方法。相反,有一个“主”模块。“主模块”是最先运行的源文件。

$ python3 prog.py
...

启动时你提供给解释器的任何文件都会成为“主”模块。文件名并不重要。

__main__ 检查

作为主脚本运行的模块通常采用以下约定:

## prog.py
...
if __name__ == '__main__':
    ## 作为主程序运行时……
    语句
  ...

if 语句内包含的语句将成为主程序。

主程序与库导入

任何 Python 文件既可以作为主程序运行,也可以作为库导入:

$ python3 prog.py ## 作为主程序运行
import prog   ## 作为库导入运行

在这两种情况下,__name__ 都是模块的名称。但是,只有在作为主程序运行时,它才会被设置为 __main__

通常,你不希望主程序的一部分语句在库导入时执行。因此,在可能以两种方式使用的代码中进行 if 检查是很常见的。

if __name__ == '__main__':
    ## 如果通过导入加载则不会执行...

程序模板

以下是编写 Python 程序的常见程序模板:

## prog.py
## 导入语句(库)
import modules

## 函数
def spam():
 ...

def blah():
 ...

## 主函数
def main():
 ...

if __name__ == '__main__':
    main()

命令行工具

Python 经常用于命令行工具

$ python3 report.py portfolio.csv prices.csv

这意味着脚本是从 shell / 终端执行的。常见的用例包括自动化、后台任务等。

命令行参数

命令行是一个文本字符串列表。

$ python3 report.py portfolio.csv prices.csv

这个文本字符串列表可以在 sys.argv 中找到。

## 在上一个bash命令中
sys.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]
...

标准输入输出

标准输入/输出(或stdio)是与普通文件工作方式相同的文件。

sys.stdout
sys.stderr
sys.stdin

默认情况下,print 输出到 sys.stdout。输入从 sys.stdin 读取。回溯信息和错误信息输出到 sys.stderr

请注意,stdio 可以连接到终端、文件、管道等。

$ python3 prog.py > results.txt
## 或者
$ cmd1 | python3 prog.py | cmd2

环境变量

环境变量在 shell 中设置。

$ export NAME=dave
$ export RSH=ssh
$ python3 prog.py

os.environ 是一个包含这些值的字典。

import os

name = os.environ['NAME'] ## 'dave'

程序随后启动的任何子进程都会反映这些更改。

程序退出

程序退出通过异常来处理。

raise SystemExit
raise SystemExit(exitcode)
raise SystemExit('Informative message')

另一种方式。

import sys
sys.exit(exitcode)

非零的退出代码表示错误。

#!

在Unix系统上,#! 行可以将脚本作为Python程序来启动。将以下内容添加到脚本文件的第一行。

#!/usr/bin/env python3
#./prog.py
...

这需要可执行权限。

$ chmod +x prog.py
## 然后你就可以执行
$./prog.py
... 输出...

注意:Windows上的Python启动器也会查找 #! 行来指示语言版本。

脚本模板

最后,这是一个作为命令行脚本运行的Python程序的通用代码模板:

#!/usr/bin/env python3
#./prog.py

## 导入语句(库)
import modules

## 函数
def spam():
  ...

def blah():
  ...

## 主函数
def main(argv):
    ## 解析命令行参数、环境等
  ...

if __name__ == '__main__':
    import sys
    main(sys.argv)

练习3.15:main() 函数

report.py 文件中添加一个 main() 函数,该函数接受命令行选项列表并产生与之前相同的输出。你应该能够像这样交互式地运行它:

>>> import report
>>> report.main(['/home/labex/project/report.py', '/home/labex/project/portfolio.csv', '/home/labex/project/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(['/home/labex/project/pcost.py', '/home/labex/project/portfolio.csv'])
Total cost: 44671.15
>>>
✨ 查看解决方案并练习

练习3.16:创建脚本

修改 report.pypcost.py 程序,使它们能够在命令行上作为脚本执行:

$./report.py portfolio.csv 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 portfolio.csv
Total cost: 44671.15
✨ 查看解决方案并练习

总结

恭喜你!你已经完成了主模块实验。你可以在LabEx中练习更多实验来提升你的技能。