乐趣区

关于python:翻译实用的Python编程0305Mainmodule

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

3.5 主模块

本节介绍主程序(主模块)的概念

主函数

在许多编程语言中,存在一个主函数或者主办法的概念。

// c / c++
int main(int argc, char *argv[]) {...}
// java
class 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

# Functions
def spam():
    ...

def blah():
    ...

# Main function
def 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 command
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]
...

规范 I/O

规范输出 / 输入(或者 stdio)是和一般文件应用雷同工作形式的文件。

sys.stdout
sys.stderr
sys.stdin

默认状况下,打印定向到 sys.stdout 文件。输出是从 sys.stdin 文件读取。回溯和谬误定向到 sys.stderr 文件。

请留神,规范输出 / 输入(stdio)能够连贯到终端(terminals),文件(files),管道(pipes)等。

bash % python3 prog.py > results.txt
# or
bash % cmd1 | python3 prog.py | cmd2

环境变量

环境变量在 shell 中设置。

bash % setenv NAME dave
bash % setenv RSH ssh
bash % 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)

非零(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 execute
bash % prog.py
... output ...

留神:Windows 零碎上的 Python 启动器也会寻找 #! 行以批示语言版本。

脚本模板

最初,这里有一个通用代码模板,用于将 Python 程序作为命令行脚本运行:

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

# Import statements (libraries)
import modules

# Functions
def spam():
    ...

def blah():
    ...

# Main function
def 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.csv
Total cost: 44671.15

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

注:残缺翻译见 https://github.com/codists/practical-python-zh

退出移动版