28
2 REPL IDE 使用 REPL 設定原始碼檔案編碼 基本模組與套件管理 認識 IDE 的使用

《Python 3.5 技術手冊》第二章草稿

Embed Size (px)

Citation preview

Page 1: 《Python 3.5 技術手冊》第二章草稿

2 從 REPL 到 IDE

使用 REPL

設定原始碼檔案編碼

基本模組與套件管理

認識 IDE 的使用

Page 2: 《Python 3.5 技術手冊》第二章草稿

2-2 Python 3.5 技術手冊

2.1 從 'Hello World' 開始

第一個 "Hello World"的出現是在 Brian Kernighan 寫的《A Tutorial

Introduction to the Language B》書籍中(B語言是 C語言的前身),用來將

'Hello World'文字顯示在電腦螢幕上,自此之後,很多的程式語言教學文件或

書籍上,已經無數次地將它當作第一個範例程式。為什麼要用 'Hello World'來

當作第一個程式範例?因為它很簡單,初學者只要鍵入簡單幾行程式(甚至一

行),可以要求電腦執行指令並得到回饋:顯示'Hello World'。

本書也要從顯示'Hello World'開始,然而,在完成這簡單的程式之後,千萬

要記得,探索這簡單程式之後的種種細節,千萬別過於樂觀地以為,你想從事

的程式設計工作就是如此容易駕馭。

2.1.1 使用 REPL

第一個顯示'Hello World'的程式碼,我們預計在 REPL(Read-Eval-Print

Loop)環境中進行(又稱為 Python Shell),這是一個簡單、互動式的程式設

計環境,不過,雖然它很簡單,然而在日後開發 Python 應用程式的日子裏,

你會經常地使用它,因為 REPL在測試一些程式片段的行為時非常方便。

現在開啟「命令提示字元」,直接輸入 python指令(不用加上任何引數),

這樣就會進入 REPL環境。

圖 2.1 Python 的 REPL 環境

來很快地撰寫一些小指令進行測試,首先做些簡單的加法運算吧!從輸入 1 + 2

之後按下 Enter開始:

>>> 1 + 2

3

>>> _

3

>>> 1 + _

4

Page 3: 《Python 3.5 技術手冊》第二章草稿

第 2 章 從 REPL 到 IDE 2-3

>>> _

4

>>>

一開始執行了 1 + 2,顯示結果為 3,_代表了互動環境中上一次運算結果,

方便你在下一次的運算中直接取用上一次的運算結果。

在 REPL 環境中,可以按 Home 鍵將游標移至行首,按 End 鍵可以將游標移

至行尾。

一開始不是說要顯示 'Hello World'嗎?接著就來命令 REPL 環境執行

print()函式,顯示指定的文字'Hello World'吧!

>>> 'Hello World'

'Hello World'

>>> print(_)

Hello World

>>> print('Hello World')

Hello World

>>>

在 Python中,使用單引號''包含住的文字,會是程式中的一個字串值,有

關字串的特性,先知道這個就可以了,後續章節還會詳加探討。在 REPL輸入

一個字串值後,會被當成是上一次的執行結果,因此 print(_)時,_就代表著

'Hello World',因此跟 print('Hello World')的執行結果是相同的。

如果在 REPL中犯錯了,REPL會有些提示訊息,怎看這些訊息有點神秘:

>>> print 'Hello World'

File "<stdin>", line 1

print 'Hello World'

^

SyntaxError: Missing parentheses in call to 'print'

>>>

在 Python 2.x中,print是個陳述句(Statement),然而從 Python 3.0

開始,必須使用 print()函式了,因此 print 'Hello World'會發生語法錯誤,其

實上面的訊息中 SyntaxError 也告知發生了語法錯誤,初學時面對這類錯誤訊

息,只要找出這個 Error 結尾的文字作為開始,慢慢也能看得懂發生了什麼錯

誤。

若要取得協助訊息,可以輸入 help(),例如:

>>> help()

Page 4: 《Python 3.5 技術手冊》第二章草稿

2-4 Python 3.5 技術手冊

Welcome to Python 3.5's help utility!

If this is your first time using Python, you should definitely check out

the tutorial on the Internet at http://docs.python.org/3.5/tutorial/.

Enter the name of any module, keyword, or topic to get help on writing

Python programs and using Python modules. To quit this help utility and

return to the interpreter, just type "quit".

To get a list of available modules, keywords, symbols, or topics, type

"modules", "keywords", "symbols", or "topics". Each module also comes

with a one-line summary of what it does; to list the modules whose name

or summary contain a given string such as "spam", type "modules spam".

help>

這會進入 help()說明頁面,注意提示符號變成了 help>,在上頭這段文字

中有說明頁面的使用方式,像是想結束說明頁面,可以輸入 quit,想哪道有哪

些模組、關鍵字等,可以輸入 modules、keywords等,例如來看看 Python中有

哪些關鍵字:

help> keywords

Here is a list of the Python keywords. Enter any keyword to get more help.

False def if raise

None del import return

True elif in try

and else is while

as except lambda with

assert finally nonlocal yield

break for not

class from or

continue global pass

help>

剛才有使用過 print()函式,你會好奇它怎麼使用嗎?在說明頁面中輸入

print就可以查詢了:

help> print

Help on built-in function print in module builtins:

print(...)

print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)

Prints the values to a stream, or to sys.stdout by default.

Optional keyword arguments:

Page 5: 《Python 3.5 技術手冊》第二章草稿

第 2 章 從 REPL 到 IDE 2-5

file: a file-like object (stream); defaults to the current sys.stdout.

sep: string inserted between values, default a space.

end: string appended after the last value, default a newline.

flush: whether to forcibly flush the stream.

help>

現在輸入 quit,回到 REPL 中,實際上,在 REPL 中也可以直接輸入

help(print)來查詢函式等說明:

help> quit

You are now leaving help and returning to the Python interpreter.

If you want to ask for help on a particular object directly from the

interpreter, you can type "help(object)". Executing "help('string')"

has the same effect as typing a particular string at the help> prompt.

>>> help(print)

Help on built-in function print in module builtins:

print(...)

print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)

...略

>>>

如果要離開 REPL 環境,可以執行 quit()函式。實際上,如果只是要執行

個小程式片段,又不想麻煩地進入 REPL,可以在使用 python指令時加上-c引

數,之後接上使用""包含的程式片段。例如:

>>> quit()

C:\Users\Justin>python -c "print('Hello World')"

Hello World

C:\Users\Justin>python -c "help(print)"

Help on built-in function print in module builtins:

print(...)

print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)

...略

C:\Users\Justin>

在 Python 官方網站 www.python.org 首頁,也提供了一個互動環境,臨時要

試個程式小片段,又不想要安裝 Python 或找個裝有 Python 的電腦時,開個瀏

覽器就可以使用囉!

Page 6: 《Python 3.5 技術手冊》第二章草稿

2-6 Python 3.5 技術手冊

圖 2.2 Python 的 REPL 環境

2.1.2 撰寫 Python 原始碼

我們總是要開啟一個原始碼檔案,正式一點地撰寫程式吧?在正式撰寫程

式之前,請先確定你可以看到檔案的副檔名,在 Windows 下預設不顯示副檔

名,這會造成重新命名檔案時的困擾,如果目前在「檔案總管」下無法看到副

檔名,Windows 7 下請執行「組合管理/資料夾和搜尋選項」,Windows 8 或

10 都可以執行「檢視/選項」,之後都是切換至「檢視」頁籤,取消「隱藏已

知檔案類型的副檔名」之選取。

Page 7: 《Python 3.5 技術手冊》第二章草稿

第 2 章 從 REPL 到 IDE 2-7

圖 2.3 取消「隱藏已知檔案類型的副檔名」

接著選擇一個資料夾來撰寫Python原始碼檔案,本書都是在C:\workspace

資料夾中撰寫程式,請新增「文字文件」(也就是.txt 文件),並重新命名文

件為「hello.py」,由於將文字文件的副檔名從.txt改為.py,系統會詢問是否更

改副檔名,請確定更改,如果是在 Windows中第一次安裝 Python,而且依照

本章之前的方式安裝,那麼會看到檔案圖示變換為以下樣式,這個圖示上的吉

祥物是兩隻小蟒蛇(因為 Python也有蟒蛇之意):

圖 2.4 變更副檔名為.py 後的圖示

Page 8: 《Python 3.5 技術手冊》第二章草稿

2-8 Python 3.5 技術手冊

雖然 Python 有蟒蛇之意,不過 Guido van Rossum 曾經表示,Python 這個名

稱其實是取自他熱愛的 BBC 著名喜劇影集《Monty Python's Flying Circus》,

Python 官 方 網 站 的 FAQ 也 記 錄 著 這 件 事 :

docs.python.org/3/faq/general.html#why-is-it-called-python

而這個 FAQ 的下一則還很幽默地列出了「Do I have to like “Monty Python’s Flying

Circus”?」這個問題,答案是「No, but it helps. :)」。

如圖 2.4中可以看到的,如果在.py檔案上按滑鼠右鍵,可以執行「Edit with

IDLE」來開啟檔案進行編輯,IDLE是 Python官方內建的編輯器(本身也使用

Python 撰寫),這會比使用 Windows 內建的記事本撰寫 Python 程式來得好

一些,你可以如下撰寫程式碼:

圖 2.5 第一個 Python 程式

很簡單的一個小程式,只是使用 Python 的 print()函式指定文字,執行時

print()函式預設會在主控台(Console)顯示指定的文字。

接著執行選單「File/Save」儲存檔案。雖然你可以直接在 IDLE 中執行

「Run/Run Module」,啟動 Python的 REPL來執行程式,不過,在這邊要直

接使用命令提示字元,請開啟命令提示字元,切換工作資料夾至 C:\workspace

(執行指令 cd c:\workspace),然後如下使用 python指令執行程式:

圖 2.6 執行第一個 Python 程式

2.1.3 哈囉!世界!

就程式語言來說,Python確實是個入門簡易的語言,不過,無論任何一個

領域都請記得「事物的複雜度不會憑空消失,只會從一個事物轉移到另一個事

Page 9: 《Python 3.5 技術手冊》第二章草稿

第 2 章 從 REPL 到 IDE 2-9

物」,在程式設計這領域也是如此,如果純綷只是想行銷 Python 這門語言給

你,介紹完方才的 Hello World程式後,我就可以開始歌頌 Python的美好。

實際上 Python也有其深入的一面,也有其會面臨的難題,若你將來打算發

揮 Python 更強大的功能,或者需要解決更複雜的問題,就會需要進一步深度

探索 Python,在本書之後的章節,也會談到 Python一些比較深入的議題。

至於現在,作為中文世界的開發者,想稍微觸碰一下複雜度,除了顯示 Hello

World之外,不如再來試試顯示「哈囉!世界!」如何?請建立一個 hello2.py

檔案,這次不要使用 IDLE,直接使用 Windows的「記事本」撰寫程式:

圖 2.7 第二個 Python 程式

接著在主控台中執行 python hello2.py,不幸地,這次出現了錯誤:

圖 2.8 喔哦!執行出錯了!

UTF-8

錯誤的訊息中顯示 SyntaxError,也就是語法錯誤,原因在於 Python 3之

後,python直譯器預期的原始碼檔案編碼必須是 UTF-8(Python 2.x預期的是

ASCII),然而,Windows 的記事本預設編碼是 MS950(相容於 Big5),兩

者對於中文字元的位元組排列方式並不相同,python直譯器看到無法解釋的位

元組,就發生了 SyntaxError。

UTF-8 是目前很流行的文字編碼方式,現在不少文字編輯器預設也會使用

UTF-8,像是方才使用的 IDLE,相同的程式碼使用 IDLE撰寫儲存,執行時並

Page 10: 《Python 3.5 技術手冊》第二章草稿

2-10 Python 3.5 技術手冊

不會發生錯誤,然而問題在於,許多人不使用 IDLE,你將來也可能會換用其他

編輯器,因此,在這邊必須告訴你這個事實。

如果你連 UTF-8 是什麼都不知道,那建議先看看〈哪來的純文字檔?〉、

〈Unicode 與 UTF〉、〈UTF-8〉這三篇文件:

openhome.cc/Gossip/Encoding/TextFile.html

openhome.cc/Gossip/Encoding/UnicodeUTF.html

openhome.cc/Gossip/Encoding/UTF8.html

Windows的記事本可以在「另存新檔」時選擇文字編碼為 UTF-8,這是解

決問題的一個方式:

圖 2.9 記事本可在「另存新檔」時選擇文字編碼為 UTF-8

Windows 中內建的記事 本並不是很 好用,我 個 人習慣用 NotePad++

(notepad-plus-plus.org),編輯檔案時,就可以直接在選單「編碼」中選擇

文字編碼:

圖 2.10 設定 NotePad++的文字編碼

Page 11: 《Python 3.5 技術手冊》第二章草稿

第 2 章 從 REPL 到 IDE 2-11

設定原始碼編碼

若不想將檔案的文字編碼設定為 UTF-8,另一個解決方式是在原始碼的第

一行,使用註解設定編碼資訊。最簡單的設定方式是:

圖 2.11 設定 Python 原始碼檔案編碼

在 Python 原始碼檔案中,#開頭代表這是一行註解,#之後不會被當成是

程式碼的一部份,如上加上#coding=MS950之後,就可以正確地執行了:

圖 2.12 哈囉!世界!

在 hello2.py 的程式碼中,input()是個函式(Python 2.x 中使用的是

raw_input()),可用來取得使用者輸入的文字,呼叫函式時指定的文字會作為

主控台中的提示訊息,在使用者輸入文字並按下 Enter後,input()函式會以字

串傳回使用者輸入的文字,在這邊你將之指定給 name 變數,之後使用 print()

函式依序顯示了'哈囉'、name與'!'。

至於為什麼說是最簡單的設定方式呢?將來你也許還會看到其他的編碼設

定方式,例如:

# -*- coding: Big5 -*-

或者是:

# vim: set fileencoding=Big5 :

也許你還會看到更多其他的方式,這是因為實際上,python 直譯器只要在

註解中看到 coding=<encoding name>或者 coding: <encoding name>出現就可以

Page 12: 《Python 3.5 技術手冊》第二章草稿

2-12 Python 3.5 技術手冊

了,因此,就算你在第一行撰寫#orz coding=MS950、#XDcoding: MS950,也都可

正確找出文字編碼設定。

這是為了因應各種編輯器的特性,有興趣的話,可以參考 PEP 0263:

www.python.org/dev/peps/pep-0263/

當中有說明,python 直譯器會使用底下這段規則表示式(Regular expression)

來擷取文字編碼設定:

^[ \t\v]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)

本書之後會介紹什麼是規則表示式,以及在 Python 中如何使用。

2.2 初識模組與套件

對於初學者來說,通常只需要一個.py原始碼檔案,就可以應付各種範例程

式的程式碼數量,然而實際的應用程式需要的程式碼數量遠比範例程式要來得

多,只使用一個.py原始碼檔案來撰寫,勢必造成程式碼管理上的混亂,你必須

學會依職責將程式碼劃分在不同的模組(Module)中撰寫,而職責相近或彼此

輔助的模組,也要知道如何使用套件(Package)來加以管理。

模組與套件也有一些要知道的細節,這一節將只介紹簡單的入門,目的是

足以應付本書一開始的幾個章節,更詳細的模組與套件說明,將會在稍後的章

節詳細介紹。

2.2.1 簡介模組

有件事實也許會令人驚訝,其實你已經撰寫過模組了,每個.py檔案本身就

是一個模組,當你撰寫完一個.py檔案,而別人打算直接享用你的成果的話,只

需要在他撰寫的.py檔案中匯入(import)就可以了。舉個例子來說,若想在一

個 hello3.py檔案中,直接重用先前撰寫好的 hello2.py檔案,可以如下撰寫程

式:

Page 13: 《Python 3.5 技術手冊》第二章草稿

第 2 章 從 REPL 到 IDE 2-13

圖 2.13 匯入模組

每個.py 檔案的主檔名就是模組名稱,想要匯入模組時必須使用 import 關

鍵字指定模組名稱,若有取用模組中定義的名稱,必須在名稱前加上模組名稱

與一個「.」,例如 hello2.name。接著來直接執行 hello3.py,看看會有什麼結

果:

圖 2.14 結合另一模組的執行結果

可以結果中前兩行顯示,就是 hello2.py 中撰寫的內容,被 import 模組中

的程式碼會被執行,接著才執行 hello3.py中 import之後的程式碼。

此時若查看.py 檔案所在的資料夾,會發現多了個__pycache__資料夾,當中

會有.pyc 檔案,這是 CPython 將.py 檔案轉譯後的位元碼檔案,之前再次匯入

同一模組,若原始碼檔案偵測到沒有變更,就不會對原始碼重頭進行語法剖析

等動作,而可以從位元碼開始直譯,以加快直譯速度。

類似地,Python本身提供有標準程式庫,若需要這些程式庫中的某個模組

功能,可以將模組匯入,例如,若想要取得命令列引數(Command-line

argument),可以透過 sys模組中的 argv清單(list)。例如:

圖 2.15 取得命令列引數

由於 argv定義在 sys模組中,在 import sys後,就必須使用 sys.argv來取

用,sys.argv清單中的資料取用時必須指定索引(Index)號碼,這個號碼實際

Page 14: 《Python 3.5 技術手冊》第二章草稿

2-14 Python 3.5 技術手冊

上從 0開始,然而 sys.argv[0]會儲存原始碼檔名,就上面的例子來說,就是儲

存'hello4.py',若有提供命令列引數,就依序從 sys.argv[1]開始儲存。一個執

行結果如下:

圖 2.16 取得命令列引數範例

如果有多個模組需要 import,除了逐行 import之外,也可以在單一行中使

用逗號「,」來區隔模組。例如:

import sys, email

使用模組用來管理原始碼,有利於原始碼的重用且可避免混亂,然而有些

函式、類別等經常使用,每次都要 import就顯得麻煩了,因此這類常用的函式、

類別等,也會被整理在一個__builtins__模組中,在__builtins__模組中的函式、

類別等名稱,都可以不用 import直接取用,而且不用加上模組名稱作為前置,

像是之前使用過的 print()、input()函式。

想知道還有哪些函式或類別嗎?可以在 REPL 中使用 dir()函式查詢

__builtins__ 模 組 , dir() 函 式 會 將 可 用 的 名 稱 列 出 , 例 如

dir(__builtins__):

圖 2.17 查詢__builtins__模組

在官方網站文件中,也有一些__builtins__模組中函式、常數的說明文件:

Page 15: 《Python 3.5 技術手冊》第二章草稿

第 2 章 從 REPL 到 IDE 2-15

docs.python.org/3.5/library/functions.html

docs.python.org/3.5/library/constants.html

2.2.2 設定 PYTHONPATH

你已經學會使用模組了,現在有個小問題,若想取用他人撰寫好的模組,

一定要將.py檔案放到目前的工作資料夾中嗎?舉個例子來說,目前的.py檔案

都放在 C:\workspace,如果執行 python指令時也是在 C:\workspace,基本上

不會有問題,然而若是在其他資料夾就會出錯了:

圖 2.18 找不找得到 hello 模組呢?

在 2.1.1中談過,python -c可以指定一段小程式來執行,因此,python -c

"import hello",就相當於在某個.py 檔案中執行了 import hello,因此這邊用

來測試是否可找到指定模組。可以看到,在找不到指定模組時,會發生

ImportError錯誤。

如果想將他人提供的.py 檔案,放到其他的資料夾(例如 lib 資料夾)中加

以管理,可以設定 PYTHONPATH環境變數來解決這個問題。python直譯器會此環

境變數中設定的資料夾中,尋找是否有指定模組名稱對應的.py檔案。例如:

圖 2.19 設定 PYTHONPATH

Page 16: 《Python 3.5 技術手冊》第二章草稿

2-16 Python 3.5 技術手冊

在 Windows 中,可以使用 SET PYTHONPATH=路徑 1;路徑 2 的方式來設定

PYTHONPATH 環境變數,多個路徑時中間使用分號「;」來區隔。實際上,python

直譯器會根據 sys.path清單中的路徑來尋找模組,以目前的設定來看,sys.path

會包含以下內容:

圖 2.20 查詢 sys.path

如果 Windows 中安裝了多個版本的 Python 環境,也可以按照類似方式設定

PATH 環境變數,例如 SET PATH=Python 環境路徑,這樣就可以切換執行的

python 直譯器版本。

因此,如果想要動態地管理模組的尋找路徑,也可以透過程式變更 sys.path

的內容來達到。例如在沒有對 PYTHONPATH設定任何資訊的情況下,在進入 REPL

後,可以如下進行設定:

圖 2.21 動態設定 sys.path

在上面的圖片中可以看到,sys.path.append('c:\workspace')對 sys.path新

增了一個路徑資訊,因此之後 import hello時,就可以在 c:\workspace找到對

應的 hello.py了。

Page 17: 《Python 3.5 技術手冊》第二章草稿

第 2 章 從 REPL 到 IDE 2-17

2.2.3 使用套件管理模組

現在你所撰寫的程式碼,可以分別放在各個模組之中,就原始碼管理上比

較好一些了,但還不是很好,就如同你會分不同資料夾來放置不同作用的檔案,

模組也應該分門別類加以放置。

舉例來說,一個應用程式中會有多個類別彼此合作,也有可能由多個團隊

共同分工,完成應用程式的某些功能塊,再組合在一起,如果你的應用程式是

多個團隊共同合作,若不分門別類放置模組,那麼若 A部門寫了個 util模組,

B部門也寫了個 util模組,當他們要將應用程式整合,若都將模組都放在同一

個 lib目錄中的話,就會發生同名的 util.py檔案覆蓋的問題。

兩個部門各自建立資料夾放置自己的 util.py檔案,然後在 PYTHONPATH中設

定路徑的方式行不通,因為執行 import util時,只會使用 PYTHONPATH第一個找

到的 util.py,你真正需要的方式,必須是能夠 import a.util 或 import b.util

來取用對應的模組。

為了便於進行套件管理的示範,我們來建立一個新的 hello_prj資料夾,這

就像是新建立應用程式專案時,必須有個專案資料夾來管理專案的相關資源。

假設你想在 hello_prj中新增一個 openhome套件,那麼請在 hello_prj中建立一

個 openhome資料夾,而 openhome資料夾中,建立一個__init__.py檔案。

圖 2.22 建立 openhome 套件

注意!資料夾中一定要有一個__init__.py檔案,該資料夾才會被視為一個

套件。在套件的進階管理中,__init__.py中其實也可以撰寫程式,不過目前請

保持__init__.py檔案內容為空。

接著,請將 2.1.3撰寫的 hello2.py檔案,複製至 openhome套件之中,然後

將 2.2.1撰寫的 hello3.py檔案,複製至 hello_prj專案資料夾,並修改 hello3.py

如下:

Page 18: 《Python 3.5 技術手冊》第二章草稿

2-18 Python 3.5 技術手冊

圖 2.23 取用套件中的模組

主要的修改就是 import openhome.hello2 與 openhome.hello2.name,也就是

模組名稱前被加上了套件名稱,這就說明了,套件名稱會成為名稱空間的一部

份。

當 python 直譯器看到 import openhome.hello2 時,會尋找 sys.path 中的路

徑裏,是否有某個資料夾中含有 openhome資料夾,若有找到,再進一步確認

其中是否有個__init__.py檔案,若有的話就確認有 openhome套件了,接著看看

其中是否有 hello2.py,如果找到,就可以順利完成模組的 import。

要執行 hello3.py,請在主控台中切換至 c:\workspace\hello_prj 資料夾,

一個執行範例如下所示:

圖 2.24 取用套件中模組的執行範例

由於套件名稱會成為名稱空間的一部份,就先前 A、B兩部門的例子來說,

可以分別建立 a套件與 b套件,當中放置各自的 util.py,當兩個部份的 a、b兩

個資料夾放到同一個 lib 資料夾時,並不會發生 util.py 檔案彼此覆蓋的問題,

而在取用模組時,可以分別 import a.util 與 import b.util,若想取用各自模

組中的名稱,也可以使用 a.util.some、b.util.other來區別。

如果模組數量很多,也可以建立多層次的套件,也就是套件中還會有套件,

在這種情況下,每個擔任套件的資料夾與子資料夾中,各要有一個__init__.py

檔案。舉例來說,若想要建立 openhome.blog 套件,那麼 openhome 資料夾中

要有個__init__.py 檔案,而 openhome/blog 資料夾中,也要有個__init__.py

檔案。

Page 19: 《Python 3.5 技術手冊》第二章草稿

第 2 章 從 REPL 到 IDE 2-19

還記得 1.2.3〈認識安裝內容〉中談過,在安裝 Python 的 lib 資料夾中,包括

了許多標準程式庫的原始碼檔案嗎?lib 資料夾包含在 sys.path 之中,這個資

料夾中也使用了一些套件來管理模組,而其中還有個 site-packages 資料夾,

用來安裝 Python 的第三方程式庫,這資料夾也包含在 sys.path 之中,通常第

三方程式庫也會使用套件來管理相關模組。

2.2.4 使用 import as 與 from import

使用套件管理,解決了實體檔案與 import模組時名稱空間的問題,然而有

時套件名稱加上模組名稱,會使得存取某個函式、類別等時,必須撰寫又臭又

長的前置,若嫌麻煩,可以使用 import as或者 from import來解決這個問題。

import as 重新命名模組

如果想要改變被匯入模組在當前模組中的變數名稱,可以使用 import as。

例如可修改先前 hello_prj中的 hello3.py為以下:

hello_prj2 hello3.py

import openhome.hello2 as hello

print('今天要來點什麼不同的嗎?', hello.name, '!')

在上面的範例中,import openhome.hello2 as hello 將 openhome.hello2 模

組,重新命名為 hello,接下來就可以使用 hello這個名稱來直接存取模組中定

義的名稱。

from import 直接匯入名稱

使用 import as是將模組重新命名,然而,存取模組中定義的名稱時,還是

得加上名稱前置,如果仍然嫌麻煩,可以使用 from import直接將模組中指定的

名稱匯入。例如:

hello_prj3 hello.py

from sys import argv

print('哈囉!', argv[1], '!')

Page 20: 《Python 3.5 技術手冊》第二章草稿

2-20 Python 3.5 技術手冊

在這個範例中,直接將 sys 模組中的 argv 名稱匯入至 hello 模組中,也就

是目前的 hello.py之中,接下來你就可以直接使用 argv而不是 sys.argv來存取

命令列引數。

如果有多個名稱想要直接匯入目前模組,除了逐行 from import之外,也可

以在單一行中使用逗號「,」來區隔。例如:

from sys import argv, path

你可以更偷懶一些,用以下的 from import語句來匯入 sys模組中全部的名

稱:

from sys import *

不過這個方式有點危險,因為很容易造成名稱衝突問題,若兩個模組中正

好都有相同的名稱,那麼比較後面 from import的名稱會覆蓋先前的名稱,導致

一些意外的臭蟲發生,因此,除非你是在撰寫一些簡單且內容不長的指令稿,

否則並不建議使用 from xxx import *的方式。

2.3 使用 IDE

在開始使用套件管理模組之後,你必須建立與套件對應的實體資料夾階

層,還要自行新增__init__.py檔案,這其實有點麻煩,你可以考慮開始使用 IDE

(Integrated Development Environment),由 IDE代勞一些套件與相關資源

管理的工作,提昇你的產能。

2.3.1 下載、安裝 PyCharm

在 Python的領域中,有為數不少的 IDE,然而使用哪個 IDE,必須根據開

發的應用程式特性,或者基於一些團隊管理等因素來決定,有時其實也是個人

口味問題,以下是一些我看過有人推薦或使用過的 IDE:

PyCharm(www.jetbrains.com/pycharm/)

PyDev(www.pydev.org/)

Komodo IDE(komodoide.com/)

Page 21: 《Python 3.5 技術手冊》第二章草稿

第 2 章 從 REPL 到 IDE 2-21

Spyder(code.google.com/archive/p/spyderlib/)

WingIDE(wingware.com/)

NINJA-IDE(www.ninja-ide.org/)

Python Tools for Visual Studio(pytools.codeplex.com/)

有時甚至會考慮使用一些功能強大的編輯器,加上一些外掛來組裝出自己專屬

的 IDE,在 Python 這個領域,要使用 IDE 或是編譯器,也是個經常論戰的話

題,這當中也有一些值得思考的要素,有興趣可以參考〈IDE、編輯器的迷思〉

這篇文章:

openhome.cc/Gossip/Programmer/IDEorEditor.html

為了能與本書至今談過的觀念相銜接,我在這邊選擇使用 PyCharm作個基

本介紹,它提供了社群版本,對於入門使用者練習來說,已足堪使用,你可以

直 接 連 線 www.jetbrains.com/pycharm/download/ , 按 下 頁 面 右 方 的

Community底下的 Download按鈕,就可進行下載。

圖 2.25 下載 PyCharm 社群版本

就撰寫這段文件的同時,可下載的 PyCharm Community版本是 5.0.4,檔

案是 pycharm-community-5.0.4.exe,由於下載後是個.exe 檔案,你必須如

Page 22: 《Python 3.5 技術手冊》第二章草稿

2-22 Python 3.5 技術手冊

1.2.2介紹的方式「解除封鎖」,並以「以系統管理員身分執行」進行安裝,安

裝的預設路徑是C:\Program Files (x86)\JetBrains\PyCharm Community Edition

5.0.4,基本上只需要直接一直按 Next與 Install就可以完成安裝了。

在安裝完成後,應用程式選單中會有個 JetBrains PyCharm Community

Edition 5.0.4 的圖示,按下就可啟動 PyCharm,初次開啟會有個畫面,詢問是

否匯入前一版本的 PyCharm設定,預設是不匯入,由於這是初次安裝,直接按

下「OK」按鈕就可以了。

圖 2.26 初次啟動 PyCharm

在下個畫面是佈景主題設定,如果你沒有特別偏好的主題,也是直接按下

「OK」接受預設值,接下來就可以準備建立新專案了。

圖 2.27 接受預設的佈景主題

2.3.2 IDE 專案管理基礎

IDE基本上就是建立於目前安裝的 Python環境之上,無論使用哪個 IDE,

最重要的是知道它如何與既有的 Python 環境對應,只有在認清這樣的對應,

才不會淪為只知道 IDE上一些傻瓜式的操作,卻不明瞭各個操作背後的原理,

這也是為何要在這邊要介紹一下 IDE的緣故。

Page 23: 《Python 3.5 技術手冊》第二章草稿

第 2 章 從 REPL 到 IDE 2-23

先前在介紹套件與模組時提到,我們會建立一個專案資料夾,在其中管理

套件、模組或其他相關資源,因此,使用 IDE的第一步,就是先新增專案,因

此請先按下「Create New Project」:

圖 2.28 建立新專案

下一步是要決定專案資料夾位置與使用的 Python直譯器,未來你的電腦中

可能不只安裝一個版本的 Python 環境,在 IDE 中通常可以管理、選擇不同的

Python 環境來開發程式,這也是使用 IDE 的好處之一。在這邊選擇在

c:\workspace\hello_prj4中建立專案:

Page 24: 《Python 3.5 技術手冊》第二章草稿

2-24 Python 3.5 技術手冊

圖 2.29 設定專案資料夾與直譯器版本

接著按下「Create」按鈕就可以建立專案了:

圖 2.30 專案基本架構

Page 25: 《Python 3.5 技術手冊》第二章草稿

第 2 章 從 REPL 到 IDE 2-25

如上圖中可看到的,在「External Libraries」中,可直接瀏覽目前使用的

python 直譯器,程式庫的位置等,基本上這些資訊,你可以試著執行

「New/Python Package」建立一個 openhome 套件,在該套件上執行

「New/Python File」建立一個 hello.py,寫點程式並執行看看:

圖 2.31 建立套件、模組與執行

可以看到,在建立套件時,IDE 會自動建立__init__.py,想要執行模組的

話,可以按右鍵執行「Run 'hello'」,其中 hello會依目前的模組名稱而有所不

同,執行過程式顯示在下面窗格中,當中明確地顯示了使用的指令,非常地方

便。

你也許會想要設定命令列引數,這可以執行選單「Run/Run…」來設定,

這會出現一個「Run」設定窗格,可讓你選擇要設定哪個模組,例如:

Page 26: 《Python 3.5 技術手冊》第二章草稿

2-26 Python 3.5 技術手冊

圖 2.32 編輯 Run 的設定

在按下「Edit」之後,會出現「Edit configuration settings」,基本上可以

發現,這邊可以用來設定 python 直譯器的一些選項,像是 PYTHONPATH

之類的設定,其中命令列引數可以在「Script parameters」中設定。

Page 27: 《Python 3.5 技術手冊》第二章草稿

第 2 章 從 REPL 到 IDE 2-27

圖 2.33 設定 python 直譯器相關選項

基於書籍篇幅有限,這邊不可能詳細地介紹 IDE 的每個功能,不過,在窕

開始使用一個 IDE 時,基本上就是像這樣,逐一找出與 Python 環境的對照,

而且要知道哪個功能在沒有使用 IDE下,會是如何設定,透過這樣的探索,才

能一方面享有 IDE的方便性,另一方面又不至於被 IDE綑綁住。

2.4 重點複習

REPL 環境是個簡單、互動式的程式設計環境,在測試一些程式片段的行

為時非常方便。

在 Python 2.x中,print 是個陳述句(Statement),然而從 Python 3.0

開始,必須使用 print()函式。

Python 3 之後,python 直譯器預期的原始碼檔案編碼必須是 UTF-8

(Python 2.x預期的是 ASCII)。若不想將檔案的文字編碼設定為 UTF-8,另

Page 28: 《Python 3.5 技術手冊》第二章草稿

2-28 Python 3.5 技術手冊

一個解決方式是在原始碼的第一行,使用註解設定編碼資訊,python 直譯器

只要在註解中看到 coding=<encoding name>或者 coding: <encoding

name>出現就可以了。

在 Python 原始碼檔案中,#開頭代表這是一行註解,#之後不會被當成是

程式碼的一部份。

每個.py檔案本身就是一個模組,檔案的主檔名就是模組名稱,想要匯入模

組時必須使用 import 關鍵字指定模組名稱,若有取用模組中定義的名稱,必

須在名稱前加上模組名稱與一個「.」。

若想要取得命令列引數,可以透過 sys模組中的 argv清單。sys.argv 清單

中的資料取用時必須指定索引號碼,這個號碼實際上從 0開始,sys.argv[0]會

儲存原始碼檔名,若有提供命令列引數,就依序從 sys.argv[1]開始儲存。

如果有多個模組需要 import,除了逐行 import之外,也可以在單一行中使

用逗號「,」來區隔模組。

在__builtins__模組中的函式、類別等名稱,都可以不用 import直接取用,

而且不用加上模組名稱作為前置。

python 直譯器會 PYTHONPATH 環境變數中設定的資料夾中,尋找是否有指定

模組名稱對應的.py 檔案。python 直譯器會根據 sys.path 清單中的路徑來尋找

模組。如果想要動態地管理模組的尋找路徑,也可以透過程式變更 sys.path的

內容來達到。

資料夾中一定要有一個__init__.py 檔案,該資料夾才會被視為一個套件。

套件名稱會成為名稱空間的一部份。可以建立多層次的套件,也就是套件中還

會有套件,每個擔任套件的資料夾與子資料夾中,各要有一個__init__.py檔案。

如果想要改變被匯入模組在當前模組中的變數名稱,可以使用 import as。

可以使用 from import直接將模組中指定的名稱匯入。

除非你是在撰寫一些簡單且內容不長的指令稿,否則並不建議使用 from xxx

import *的方式,以免造成名稱空間衝突的問題。