# 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