日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python源码只有编译成二进制_Python源码包和二进制包(包含打包过程细节讲解)...

發布時間:2024/1/23 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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源码包和二进制包(包含打包过程细节讲解)...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。