翻译:《实用的Python编程》03_05_Main_module
目录 | 上一节 (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.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.84
bash $ python3 pcost.py Data/portfolio.csv
Total cost: 44671.15
目录 | 上一节 (3.4 模块) | 下一节 (3.6 设计讨论)
注:完整翻译见 https://github.com/codists/practical-python-zh
翻译:《实用的Python编程》03_05_Main_module的更多相关文章
- 翻译:《实用的Python编程》InstructorNotes
实用的 Python 编程--讲师说明 作者:戴维·比兹利(David Beazley) 概述 对于如何使用我的课程"实用的 Python 编程"进行教学的问题,本文档提供一些通用 ...
- 翻译:《实用的Python编程》README
欢迎光临 大约 25 年前,当我第一次学习 Python 时,发现 Python 竟然可以被高效地应用到各种混乱的工作项目上,我立即被震惊了.15 年前,我自己也将这种乐趣教授给别人.教学的结果就是本 ...
- 翻译:《实用的Python编程》05_02_Classes_encapsulation
目录 | 上一节 (5.1 再谈字典) | 下一节 (6 生成器) 5.2 类和封装 创建类时,通常会尝试将类的内部细节进行封装.本节介绍 Python 编程中有关封装的习惯用法(包括私有变量和私有属 ...
- 翻译:《实用的Python编程》04_02_Inheritance
目录 | 上一节 (4.1 类) | 下一节 (4.3 特殊方法) 4.2 继承 继承(inheritance)是编写可扩展程序程序的常用手段.本节对继承的思想(idea)进行探讨. 简介 继承用于特 ...
- 翻译:《实用的Python编程》01_02_Hello_world
目录 | 上一节 (1.1 Python) | 下一节 (1.3 数字) 1.2 第一个程序 本节讨论有关如何创建一个程序.运行解释器和调试的基础知识. 运行 Python Python 程序始终在解 ...
- 翻译:《实用的Python编程》03_03_Error_checking
目录 | 上一节 (3.2 深入函数) | 下一节 (3.4 模块) 3.3 错误检查 虽然前面已经介绍了异常,但本节补充一些有关错误检查和异常处理的其它细节. 程序是如何运行失败的 Python 不 ...
- 翻译:《实用的Python编程》03_04_Modules
目录 | 上一节 (3.3 错误检查) | 下一节 (3.5 主模块) 3.4 模块 本节介绍模块的概念以及如何使用跨多个文件的函数. 模块和导入 任何一个 Python 源文件都是一个模块. # f ...
- 翻译:《实用的Python编程》04_01_Class
目录 | 上一节 (3.6 设计讨论) | 下一节 (4.2 继承) 4.1 类 本节介绍 class 语句以及创建新对象的方式. 面向对象编程(OOP) 面向对象编程是一种将代码组织成对象集合的编程 ...
- 翻译:《实用的Python编程》05_00_Overview
目录 | 上一节 (4 类和对象) | 下一节 (6 生成器) 5. Python 对象的内部工作原理 本节介绍 Python 对象的内部工作原理.来自其它语言的程序员通常会发现 Python 的类概 ...
随机推荐
- 前、中、后序遍历随意两种是否能确定一个二叉树?理由? && 栈和队列的特点和区别
前序和后序不能确定二叉树理由:前序和后序在本质上都是将父节点与子结点进行分离,但并没有指明左子树和右子树的能力,因此得到这两个序列只能明确父子关系,而不能确定一个二叉树. 由二叉树的中序和前序遍历序列 ...
- SpringSecurity简单使用
什么是SpringSecurity? Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置 ...
- 梨子带你刷burp练兵场(burp Academy) - 服务端篇 - Sql注入配套漏洞讲解笔记
目录 Sql注入 什么是Sql注入呢? Sql注入有哪些例子? 检索隐藏数据 打破应用逻辑 利用Union进行跨库查询 如何确定利用Union的注入攻击所需的列数呢? 如何确定Union的查询结果中哪 ...
- ArcGIS处理栅格数据(二)
五.栅格数据的配准 1.有参考图层 ① 在ArcMap里面添加需要配准的栅格数据集和参考数据集. ② 在ArcMap里面添加"地理配准"工具条. 添加成功后如下图所示: ③ 将需要 ...
- 3.keepalived+脚本实现nginx高可用
标题 : 3.keepalived+脚本实现nginx高可用 目录 : Nginx 序号 : 3 else exit 0 fi else exit 0 fi - 需要保证脚本有执行权限,可以使用chm ...
- leetcode17 电话号码的字母组合 dfs
就dfs吧.... 然后,我傻了.前一道题不用考虑空,这道题就要考虑.... 还有注意vector要引用传递 class Solution { public: void dfs(string temp ...
- vue开发环境和生产环境配置
开发环境配置 一般情况下开发环境是会跨域的,所以我们只需要在跨域的位置配置即可.进入config/index.js,在proxyTable对象里面添加代码,如下 '/api': { target: ' ...
- 机器学习入门实战——基于knn的airbnb房租预测
数据读取 import pandas as pd features=['accommodates','bathrooms','bedrooms','beds','price','minimum_nig ...
- element-ui select get selected option object
element-ui select get selected option object value-key="value" === String :value="{va ...
- UA 广告 All In One
UA 广告 All In One UA 广告是什么 广告投放 / 市场营销 互联网营销和分析专用名词速览 http://www.chinawebanalytics.cn/digital-marketi ...