python源码只有编译成二进制_Python源码包和二进制包(包含打包过程细节讲解)...
通常來說,Python 程序包有兩種類型的發行版,分別是源代碼發行版和二進制(構建)發行版。
源代碼發行版是最簡單的,也是最不依賴于平臺的,對于純 Python 包,無需動腦選擇它就行,這種發行版只包含 Python 源代碼,具有高度的可移植性。
但當包中引入了用其他語言(例如 C 語言)編寫的一些擴展,如果包用戶的環境中有合適的開發工具鏈(主要包括編譯器和正確的 C 頭文件)的話,那么源代碼發行版也是可行的。相比較而言,二進制發行版的格式可能更適合,因為它可以為特定平臺提供已經構建好的擴展。
sdist發行版
sdist 命令是最簡單的命令,它創建一棵分發樹,其中復制了運行一個包所需要的全部內容,這棵樹被歸檔到一個或多個存檔文件中(通常只創建一個 tar 文件),這個存檔基本上是源代碼樹的副本。
這個命令是從目標系統獨立地分發一個包的最簡單方法,它將創建一個 dist 文件夾,里面包含可被分發的存檔。為了能夠使用它,必須向 setup 傳遞一個額外參數以提供版本號,如果沒有提供 version 值,那它默認為 version = 0.0.0,代碼如下:
from setuptools import setup
setup(
name='acme.sql',
version='0.1.1'
)
這個版本號在升級安裝時非常有用,因為每次發布包時版本號都會增加,這樣目標系統就知道它發生了變化。
我們運行帶有這個額外參數的 sdist 命令,代碼如下:
$ python setup.py sdist
running sdist
...
creating dist
tar -cf dist/acme.sql-0.1.1.tar acme.sql-0.1.1
gzip -f9 dist/acme.sql-0.1.1.tar
removing 'acme.sql-0.1.1' (and everything under it)
$ ls dist/
acme.sql-0.1.1.tar.gz
在 Windows 中,存檔其實就是一個ZIP文檔。
版本被用于標記存檔名稱,這個存檔可以在任何擁有 Python 的系統上分發并安裝。在 sdist 發行版中,如果包里面包含 C 庫或擴展,那么目標系統將負責編譯它們。
這在基于 Linux 的系統或 Mac OS 中很常見,因為這些系統通常都會提供編譯器,但在 Windows 下卻并不常見。因此,如果一個包打算在多個平臺中運行,那么分發時應該同時提供預構建的發行版。
bdist和wheels發行版
為了能夠分發預構建的發行版,distutils 提供了 build 命令,可以通過 4 個步驟來編譯包,分別是:
build_py:通過字節編譯并將其復制到構建文件夾中,來構建純 Python 模塊。
build_clib:如果包中包含任何 C 庫,它會利用 C 編譯器在構建文件夾中創建一個靜態庫來構建C庫。
build_ext:構建 C 擴展,并像 build_clib 一樣將結果放在構建文件夾中。
build_scripts:構建被標記為腳本的模塊。如果第一行被設為 !# 的話,它還會修改解釋器路徑并修改文件模式使其變為可執行文件。
上面每個步驟都是可以被單獨調用的命令,編譯過程的結果是構建一個文件夾,里面包含要安裝的包所需要的全部內容。
需要注意的是,distutils 包中還沒有提供交叉編譯器的選項,也就是說,這些命令的結果總是針對構建時所使用的操作系統。
如果必須創建一些 C 擴展,構建過程將使用系統編譯器和 Python 頭文件(Python.h)。Python 從源代碼構建完成之后這個包含(include)文件就是可用的了。對于打包的發行版,可能需要針對系統發行版的額外包,至少在流行的 Linux 發行版中,它通常被命名為 python-dev,其包含構建 Python 擴展所有必要的頭文件。
所使用的 C 編譯器是系統編譯器,對于基于 Linux 系統或 Mac OS X 而言,它分別是 gcc 或 clang。對于 Windows 而言,可以使用 Microsoft Visual C++,也可以使用開源項目 MinGW,可以在 distutils 中進行相應的配置。
bdist 命令使用 build 命令來構建二進制發行版。它調用 build 和所有依賴的命令,然后用和 sdist 相同的方式創建一份存檔。
我們在 Mac OS X 系統中為 acme.sql 創建一個二進制發行版,如下所示:
$ python setup.py bdist
running bdist
running bdist_dumb
running build
...
running insta1l_scripts
tar -cf dist/acme.sql-0.1.1.macosx-10.3-fat.tar
gzip -f9 acme.sql-0.1.1.macosx-10.3-fat.tar
removing 'build/bdist.macosx-10.3-fat/dumb' (and everything under it)
$ ls dist/
acme.sql-0.1.1.macosx-10.3-fat.tar.gz acme.sql-0.1.1.tar.gz
注意,新創建的存檔名稱中包含系統名稱及其發行版本(Mac OS X 10.3)。
在 Windows 中,調用相同的命令將會創建一個特定的發行版存檔,如下所示:
C:\acme.sql> python.exe setup.py bdist
...
C:\acme.sql> dir dist
25/02/2008 08:18
25/02/2008 08:18
25/02/2008 08:24 16 055 acme.sql-0.1.Win32.zip
1 File(s) 16 055 bytes
2 Dir(s) 22 239 752 192 bytes free
如果一個包里包含 C 代碼,那么除了源代碼發行版之外,發布盡可能多的不同的二進制發行版也很重要。至少對于那些沒存安裝 C 編譯器的人是很重要的。
二進制版本中包含一棵可以汽接復制到 Python 樹中的樹,它主要包含一個文件夾,將被復制到 Python 的 site-packages 文件夾中。同時,它還可能包含緩存字節碼文件(在 Python 2.x 中是 *.pyc 文件,在 Python 3.x 中是 __pycache__/*.pyc)。
另一種構建發行版是 wheel 包提供的“wheel”,安裝完 wheel 后(例如使用 pip),它會向 distutils 中添加一個新的 bdist_wheel 命令。wheel 允許創建特定平臺的發行版(目前僅適用于 Windows 和 Mac OS X),作為普通 bdist 發行版的替代。
設計 wheel 是為了替代早先 setuptools 引入的另一種 egg 版本,egg 現在己經過時了,所以這里不再詳細介紹它。
使用 wheel 的優點相當多,在 Python Wheels 中提到的優點如下所示:
更快速地安裝純 Python 包和本地 C 擴展包;
避免安裝任意代碼執行(避免 setup.py);
安裝 C 擴展不需要 Windows 或 OS X 上的編譯器。
允許更好的緩存,用于測試和持續集成。
創建 .pyc 文件作為安裝的一部分,以確保它們匹配所使用的 Python 解釋器;
在跨平臺和跨機器上更一致的安裝。
根據 PyPA 的推薦,wheel 應該成為默認的分發格式。但 Linux 平臺特定的 wheel 還不可用,因此如果必須分發帶有 C 擴展的包,那么需要為 Linux 用戶創建 sdist 發行版。
總結
以上是生活随笔為你收集整理的python源码只有编译成二进制_Python源码包和二进制包(包含打包过程细节讲解)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python数据结构题目_《数据结构与算
- 下一篇: websocket python爬虫_p