Giới thiệu sách Python: Python 101

python 101

Python 101

Michael Driscoll

Contents
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

A Brief History of Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Conventions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Reader Feedback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Errata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

Part I - Learning the Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Chapter 1 - IDLE Programming
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Using IDLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Other Tips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

Chapter 2 - All About Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
How to Create a String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
String Concatenation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
String Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
String Slicing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
String Formatting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

Chapter 3 - Lists, Tuples and Dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Tuples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

Chapter 4 - Conditional Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
The if statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Boolean Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Checking for Nothing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Special Characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
if __name__ == “__main__” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

CONTENTS
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

Chapter 5 - Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
The for Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

The while Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
What else is for in loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

Chapter 6 - Python Comprehensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
List Comprehensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Dictionary Comprehensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Set Comprehensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

Chapter 7 - Exception Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Common Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
How to Handle Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
The finally Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
try, except, or else! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

Chapter 8 - Working with Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
How to Read a File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
How To Read Files Piece by Piece . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
How to Read a Binary File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Writing Files in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Using the with Operator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Catching Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

Chapter 9 - Importing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
import this . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Using from to import . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Importing Everything! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

Chapter 10 - Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
An Empty Function (the stub) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Passing Arguments to a Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Keyword Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
*args and **kwargs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
A Note on Scope and Globals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Coding Tips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

Chapter 11 - Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Creating a Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
What is self? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Subclasses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

Part II - Learning from the Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Chapter 12 - Introspection
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

The Python Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
The Python Dir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Python Help! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

Chapter 13 - The csv Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Reading a CSV File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Writing a CSV File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

Chapter 14 - configparser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Creating a Config File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
How to Read, Update and Delete Options . . . . . . . . . . . . . . . . . . . . . . . . . . 82
How to Use Interpolation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

Chapter 15 - Logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Creating a Simple Logger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
How to log From Multiple Modules (and Formatting too!) . . . . . . . . . . . . . . . . . 87
Configuring Logs for Work and Pleasure . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

Chapter 16 - The os Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
os.name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
os.environ, os.getenv() and os.putenv() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
os.chdir() and os.getcwd() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
os.mkdir() and os.makedirs() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
os.remove() and os.rmdir() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
os.rename(src, dst) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
os.startfile() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
os.walk() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
os.path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
os.path.basename . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
os.path.dirname . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
os.path.exists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

os.path.isdir / os.path.isfile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
os.path.join . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
os.path.split . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

Chapter 17 - The email / smtplib Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Email Basics - How to Send an Email with smtplib . . . . . . . . . . . . . . . . . . . . . 104
Sending Multiple Emails at Once . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Send email using the TO, CC and BCC lines . . . . . . . . . . . . . . . . . . . . . . . . . 109
Add an attachment / body using the email module . . . . . . . . . . . . . . . . . . . . . 110
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

Chapter 18 - The sqlite Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
How to Create a Database and INSERT Some Data . . . . . . . . . . . . . . . . . . . . . 113
Updating and Deleting Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Basic SQLite Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

Chapter 19 - The subprocess Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
The call function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
The Popen Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Learning to Communicate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

Chapter 20 - The sys Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
sys.argv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
sys.executable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
sys.exit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
sys.path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
sys.platform . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
sys.stdin / stdout / stderr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126

Chapter 21 - The threading module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Using Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Writing a Threaded Downloader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Using Queues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133

Chapter 22 - Working with Dates and Time . . . . . . . . . . . . . . . . . . . . . . . . . . 135
The datetime Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
datetime.date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
datetime.datetime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
datetime.timedelta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137

The time Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
time.ctime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
time.sleep . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
time.strftime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
time.time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140

Chapter 23 - The xml module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Working with minidom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Parsing with ElementTree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
How to Create XML with ElementTree . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
How to Edit XML with ElementTree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
How to Parse XML with ElementTree . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152

Part III - Intermediate Odds and Ends . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Chapter 24 - The Python Debugger
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

How to Start the Debugger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Stepping Through the Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
Setting breakpoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158

Chapter 25 - Decorators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
A Simple Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Creating a Logging Decorator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Built-in Decorators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
@classmethod and @staticmethod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
Python Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Replacing Setters and Getters with a Python property . . . . . . . . . . . . . . . . . . . . 165
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169

Chapter 26 - The lambda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Tkinter + lambda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171

Chapter 27 - Code Profiling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Profiling Your Code with cProfile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176

Chapter 28 - An Intro to Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Testing with doctest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Running doctest via the Terminal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Running doctest Inside a Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Running doctest From a Separate File . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180

Test Driven Development with unittest . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
The First Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
The Second Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
The Third (and Final) Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
Other Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189

Part IV - Tips, Tricks and Tutorials . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
Chapter 29 - Installing Modules
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192

Installing from Source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Using easy_install . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Using pip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
A Note on Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194

Chapter 30 - ConfigObj . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Using a configspec . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198

Chapter 31 - Parsing XML with lxml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
Parsing XML with lxml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Parsing the Book Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
Parsing XML with lxml.objectify . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Creating XML with lxml.objectify . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208

Chapter 32 - Python Code Analysis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Getting Started with pylint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Analyzing Your Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Getting Started with pyflakes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213

Chapter 33 - The requests package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Using requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
How to Submit a Web Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216

Chapter 34 - SQLAlchemy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
How to Create a Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
How to Insert / Add Data to Your Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
How to Modify Records with SQLAlchemy . . . . . . . . . . . . . . . . . . . . . . . . . 222
How to Delete Records in SQLAlchemy . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
The Basic SQL Queries of SQLAlchemy . . . . . . . . . . . . . . . . . . . . . . . . . . . 223

Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225

Chapter 35 - virtualenv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Creating a Virtual Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227

Part V - Packaging and Distribution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228

Chapter 36 - Creating Modules and Packages . . . . . . . . . . . . . . . . . . . . . . . . . 230
How to Create a Python Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
How to Create a Python Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234

Chapter 37 - How to Add Your Code to PyPI . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Creating a setup.py File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Registering Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Uploading Packages to PyPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238

Chapter 38 - The Python egg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
Creating an egg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240

Chapter 39 - Python wheels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Creating a wheel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Installing a Python wheel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243

Chapter 40 - py2exe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
Creating a Simple GUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
The py2exe setup.py file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Creating an Advanced setup.py File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249

Chapter 41 - bbfreeze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
Getting Started with bbfreeze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
Using bbfreeze’s Advanced Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . 252
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255

Chapter 42 - cx_Freeze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Getting Started with cx_Freeze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Advanced cx_Freeze - Using a setup.py File . . . . . . . . . . . . . . . . . . . . . . . . . 258
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260

Chapter 43 - PyInstaller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
Getting Started with PyInstaller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
PyInstaller and wxPython . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266

Chapter 44 - Creating an Installer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Getting Started with GUI2Exe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
Let’s Make an Installer! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273

Appendix A: Putting It All Together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
The Background . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
The Specification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
Breaking the Specification Down . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Turning Chapters Into a Book . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Reading the Customer CSV File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
Emailing the PDF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
Putting it all Together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284