# 構建 Cython 代碼
> 原文: [http://docs.cython.org/en/latest/src/quickstart/build.html](http://docs.cython.org/en/latest/src/quickstart/build.html)
與 Python 不同,Cython 代碼必須編譯。這發生在兩個階段:
> * `.pyx`文件由 Cython 編譯為`.c`文件,它含有 Python 擴展模塊的代碼。
> * `.c`文件由 C 編譯器編譯為`.so`文件(或 Windows 上的`.pyd`),可直接被`import`引入到 一個Python會話中. Distutils 或 setuptools 負責這部分。雖然 Cython 可以在某些情況下為你調用它們。
要完全理解 Cython + distutils / setuptools 構建過程,可能需要閱讀更多關于[分發 Python 模塊](https://docs.python.org/3/distributing/index.html)的內容。
有幾種方法可以構建 Cython 代碼:
> * 寫一個 distutils / setuptools `setup.py`。這是正常和推薦的方式。
> * 使用 [Pyximport](../userguide/source_files_and_compilation.html#pyximport),導入 Cython `.pyx`文件就像它們是`.py`文件一樣(使用 distutils 在后臺編譯和構建)。這種方法比編寫`setup.py`更容易,但不是很靈活。因此,如果您需要某些編譯選項,則需要編寫`setup.py`。
> * 手動運行`cython`命令行工具程序來將`.pyx`文件編譯生成`.c`文件,然后手動將`.c`文件編譯成適合從 Python 導入的共享庫或 DLL。(這些手動步驟主要用于調試和實驗。)
> * 使用 [[Jupyter]](#jupyter) 筆記本或 [[Sage]](install.html#sage) 筆記本,兩者都允許 Cython 代碼內聯。這是開始編寫 Cython 代碼并運行它的最簡單方法。
目前,使用 distutils 或 setuptools 是構建和分發 Cython 文件的最常用方式。其他方法在參考手冊的 [源文件和編譯](../userguide/source_files_and_compilation.html#compilation) 部分中有更詳細的描述。
## 使用 distutils 構建 一個Cython 模塊
想象一下文件`hello.pyx`中的一個簡單的“hello world”腳本:
```py
def say_hello_to(name):
print("Hello %s!" % name)
```
以下是相應的`setup.py`腳本:
```py
from distutils.core import setup
from Cython.Build import cythonize
setup(name='Hello world app',
ext_modules=cythonize("hello.pyx"))
```
要構建,請運行`python setup.py build_ext --inplace`。然后只需啟動一個 Python 會話并執行`from hello import say_hello_to`并根據需要使用導入的函數。
如果您使用 setuptools 而不是 distutils,則需要注意,運行`python setup.py install`時的默認操作是創建一個壓縮的`egg`文件,當您嘗試從依賴包中使用它們時,這些文件無法與`pxd`文件一起用于`pxd`文件。為防止這種情況,請在`setup()`的參數中包含`zip_safe=False`。
## 使用Jupyter筆記本來構建
Cython 可以通過 Web 瀏覽器通過 Jupyter 筆記本方便地和交互式地使用。要安裝 Jupyter 筆記本,例如進入 virtualenv,使用 pip:
```py
(venv)$ pip install jupyter
(venv)$ jupyter notebook
```
要啟用對 Cython 編譯的支持,請按照 [安裝指南](install.html#install) 中的說明安裝 Cython,并從 Jupyter 筆記本中加載`Cython`擴展:
```py
%load_ext Cython
```
然后,使用`%%cython`標記為單元格添加前綴以進行編譯:
```py
%%cython
cdef int a = 0
for i in range(10):
a += i
print(a)
```
您可以通過傳遞`--annotate`選項來顯示 Cython 的代碼分析:
```py
%%cython --annotate
...
```

有關`%%cython`魔法參數的更多信息,請參閱 [使用 Jupyter 筆記本](../userguide/source_files_and_compilation.html#compiling-notebook) 進行編譯。
## 使用 Sage 筆記本

對于 Sage 數學發行版的用戶,Sage 筆記本允許通過在單元格頂部鍵入`%cython`并進行評估來透明地編輯和編譯 Cython 代碼。導入到運行會話中的 Cython 單元格中定義的變量和函數。
> [[Jupyter]](#id1) [https://jupyter.org/](https://jupyter.org/)
- Cython 3.0 中文文檔
- 入門
- Cython - 概述
- 安裝 Cython
- 構建 Cython 代碼
- 通過靜態類型更快的代碼
- Tutorials
- 基礎教程
- 調用 C 函數
- 使用 C 庫
- 擴展類型(又名.cdef 類)
- pxd 文件
- Caveats
- Profiling
- Unicode 和傳遞字符串
- 內存分配
- 純 Python 模式
- 使用 NumPy
- 使用 Python 數組
- 進一步閱讀
- 相關工作
- 附錄:在 Windows 上安裝 MinGW
- 用戶指南
- 語言基礎
- 擴展類型
- 擴展類型的特殊方法
- 在 Cython 模塊之間共享聲明
- 與外部 C 代碼連接
- 源文件和編譯
- 早期綁定速度
- 在 Cython 中使用 C ++
- 融合類型(模板)
- 將 Cython 代碼移植到 PyPy
- Limitations
- Cython 和 Pyrex 之間的區別
- 鍵入的內存視圖
- 實現緩沖協議
- 使用并行性
- 調試你的 Cython 程序
- 用于 NumPy 用戶的 Cython
- Pythran 作為 Numpy 后端