讀書筆記:LearningPython第五版 (第三章 如何執行程式)
Chap3 How You Run Programs
3.1 互動式提示符
3.1.1 執行互動式環境
3.1.2 Windows新的 啟動
從Python 3.3 開始,Windows平臺上多了py
和 pyw
2個啟動程式的方式:
c:\code> py −2 Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] ... Type "help", "copyright", "credits" or "license" for more information. >>> ^Z c:\code> py −3.1 Python 3.1.4 (default, Jun 12 2011, 14:16:16) [MSC v.1500 64 bit (AMD64)] ...
3.2 System Command Lines and Files
把檔案儲存在module
中,module
就是存放python程式碼的文字檔案。 有些人把 script
稱作直接執行的檔案,而把被引入的python檔案叫做module
.
3.2.1 第一個指令碼
# A first Python script
import sys # Load a library module
print(sys.platform)
python script1.py
幾乎在最近所有的Windows版本中,執行指令碼的時候可以直接輸入指令碼的名字,而不需要加上python,因為Windows能在其登錄檔中查詢到 .py
3.3 Unix-Style Executable Scripts: #!
3.3.1 Unix Script Basics
在Unix以及類Unix系統中, 可以讓python程式碼當作 可執行指令碼,就像shell指令碼那樣,只有2個要求:
- python檔案的第一行必須以
#!
開頭,後面跟著直譯器的路徑,如:#!/usr/bin/python3.6
- 檔案有 可執行 許可權
例子:
#!/usr/local/bin/python
print('The Bright Side ' + 'of Life...')
執行:
./brian
這個檔案不需要以.py結尾,因為它也不需要被別的檔案引入,所以無所謂檔名
3.3.2 The Unix env Lookup Trick
對於 可執行指令碼,第一行可以這樣寫:
#!/usr/bin/env python
這個是利用了 env
這個程式,讓它來在系統的 PATH
路徑中搜索可執行的python命令。 這種寫法是現在更加推薦的。
前提是假設了
env
的路徑在 /usr/bin/env
3.3.3 The Python 3.3 Windows Launcher: #! Comes to Windows
在Python3.2版本以及以前, Windows平臺上只能使用普通的命令列來執行 Python指令碼檔案。 但是在3.3開始, 除了 py
這個新的 可執行檔案以外,還提供了對#!
的支援, 能夠指定不同的python直譯器版本,並且能理解/usr/bin/env
形式:
c:\code> type robin3.py
#!/usr/bin/python3
print('Run', 'away!...') # 3.X function
c:\code> py robin3.py # Run file per #! line version
Run away!...
c:\code> type robin2.py
#!python2
print 'Run', 'away more!...' # 2.X statement
c:\code> py robin2.py # Run file per #! line version
Run away more!...
c:\code> py −3.1 robin3.py # Run per command-line argument
Run away!...
如果沒有指定版本編號或者設定
PY_PYTHON
環境變數,那麼預設執行 python2版本
3.4 Clicking File Icons
see the platform usage documentation “Python Setup and Usage” in Python’s standard manual set for more details
To simulate 2.X’s input in 3.X, use eval(input())
3.5 Module Imports and Reloads
3.5.1 Import and Reload Basics
簡單來說,module
就是一個 Python檔案。 import操作 會將這個被引入的模組 執行一遍。
在一次互動式session中,只有第一次import的時候,才會執行這個模組。之後再import它,就不會有任何作用。 因為這個 將會在 Chap22看到, import
操作的開銷很大,它需要:
- 找到檔案
- 編譯檔案為
byte code
- 執行程式碼
3.5.2. 重新load模組:
>>> from imp import reload # Must load from module in 3.X (only)
>>> reload(script1)
win32
65536
Spam!Spam!Spam!Spam!Spam!Spam!Spam!Spam!
<module 'script1' from '.\\script1.py'> # 列印的是`reload`函式的返回值,是一個 python module物件
在python2中,reload是 built-in函式,而python3中,reload函式在 imp模組中
3.5.3 The Grander Module Story: Attributes
module
主要就是 一堆變數名字的 打包,稱作namespace
, 其中暴露出來的可以訪問的名字就稱作attributes
。
- 當使用
import
引入模組時, 模組整個被引入進來 - 當使用
from
引入模組時,實際上是將模組的這些attributes
複製成了 一些變數
dir
函式可以檢視模組內有哪些 names
reloading 一個模組,就只重新載入這個模組,不會重新載入 它本身載入的其他模組。
python引入模組的路徑叫做 module search path, 是由 PYTHONPATH
環境變數定義的內容 加上一些標準路徑組成。可以從 sys.path
檢視。
3.6 Using exec
to Run Module Files
>>> exec(open('script1.py').read())
讀入並且執行, 不同於import的那種模式。
3.7 The IDLE User Interface
空
3.8 Debug
- 看錯誤提示
- IDE錯誤除錯
- pdb
- -i 選項