9. 最高層級元件
***************

Python 直譯器可以從多種來源獲得輸入：作為標準輸入或程式引數自腳本傳入
、以互動式鍵入、自模組原始檔引入等等。這一章將給出在這些情況下所用的語
法。


9.1. 完整的 Python 程式
=======================

雖然語言規範描述不必規定語言直譯器是如何被叫用（invoke）的，但對完整的
Python 程式加以說明還是很有用的。一個完整的 Python 程式會在最小初始化
環境中被執行：所有內建和標準模組均為可用，但均處於未初始化狀態，只有
"sys"（各種系統服務）、"builtins"（內建函式、例外和 "None"）和
"__main__" 除外。後者用於為完整程式的執行提供區域性和全域性命名空間
(namespace)。

用於一個完整 Python 程式的語法，即下節所描述的檔案輸入。

直譯器也可以透過互動模式被叫用；在此情況下，它並不讀取和執行一個完整程
式，而是每讀取一條陳述式就執行一次（可能為複合陳述式）。此時的初始環境
與一個完整程式的相同；每條陳述式會在 "__main__" 的命名空間中被執行。

一個完整程式可透過三種形式被傳遞給直譯器：使用 "-c" *字串*命令列選項、
使用一個檔案作為第一個命令列引數、或者使用標準輸入。如果檔案或標準輸入
是一個 tty 裝置，直譯器會進入互動模式；否則它會將檔案當作一個完整程式
來執行。


9.2. 檔案輸入
=============

所有從非互動式檔案讀取的輸入都具有相同的形式：

   file_input: (NEWLINE | statement)* ENDMARKER

此語法用於下列幾種情況：

* 剖析一個完整 Python 程式時（從檔案或字串）；

* 剖析一個模組時；

* 剖析一個傳遞给 "exec()" 函數的字串時；


9.3. 互動式輸入
===============

互動模式下的輸入使用以下語法進行剖析：

   interactive_input: [stmt_list] NEWLINE | compound_stmt NEWLINE | ENDMARKER

注意在互動模式下，一條（最高層級）複合陳述式最後必須帶有一個空行；這能
夠幫助剖析器確定輸入已經結束。


9.4. 運算式輸入
===============

"eval()" 被用於運算式輸入，它會忽略開頭的空白。傳遞給 "eval()" 的字串
引數必須具有以下形式：

   eval_input: expression_list NEWLINE* ENDMARKER
