Cpython編譯后再使用Pyinstaller打包的詳細(xì)教程
一、Cpython
Python是一門解釋型語(yǔ)言,當(dāng)我們想讓其他人運(yùn)行我們的代碼時(shí),如果直接將.py源代碼發(fā)送給他人,那么源代碼將沒(méi)有任何安全性可言,也就是任何一個(gè)人都可以打開(kāi)源代碼一看究竟,任何人都可以隨意修改源代碼。
而為了防止源代碼泄露,可以將Python源代碼編譯生成.pyd庫(kù)文件或者.so庫(kù)文件:Windows平臺(tái)生成pyd文件,Linux生成so文件。
1.1 Python有以下幾種類型的文件
py:Python控制臺(tái)程序的源代碼文件
pyw:Python帶用戶界面的源代碼文件
pyx:Python包源文件
pyc:Python字節(jié)碼文件(可通過(guò)逆向編譯來(lái)得到源碼)
pyo:Python優(yōu)化后的字節(jié)碼文件(可通過(guò)逆向編譯來(lái)得到源碼)
pyd:在Windows平臺(tái)上Python的庫(kù)文件(Python版DLL)
so:在Linux平臺(tái)上Python的庫(kù)文件是so文件
1.2 使用Cpython編譯項(xiàng)目步驟
example:
hello.py
def say_hello(): print("Hello!")
1.2.1 安裝Cpython
pip3 install Cython
1.2.2 編寫(xiě)轉(zhuǎn)換文件
setup.py
from setuptools import setup from Cython.Build import cythonize # python3 setup.py build_ext --inplace # 所有需要編譯的py文件 all_py_file = ['hello.py'] setup( name="hello", ext_modules=cythonize(all_py_file), version="1.0", author="Leo", author_email="LeoLi.Li@groupm.com" )
1.2.3 執(zhí)行轉(zhuǎn)換生成so文件
進(jìn)入目錄
執(zhí)行:python3 setup.py build_ext --inplace
1.2.4 測(cè)試編譯好的so文件
將py文件等相關(guān)編譯文件刪除
測(cè)試是否可以正常導(dǎo)入并使用hello.py的函數(shù)
1. 3yd/so文件反編譯?
pyd/so文件是由 Cython首先把python源碼翻譯成了 .c文件(這個(gè)過(guò)程基本不可逆),再把這個(gè).c文件編譯成了pyd/so文件。
二、 Pyinstaller
pyinstaller是一個(gè)第三方庫(kù),它能夠在Windows、Linux、 Mac OS X 等操作系統(tǒng)下將 Python 源文件打包,通過(guò)對(duì)源文件打包, Python 程序可以在沒(méi)有安裝 Python 的環(huán)境中運(yùn)行,也可以作為一個(gè) 獨(dú)立文件方便傳遞和管理。
Pyinstaller打包的可執(zhí)行文件并不是跨平臺(tái)的,而是希望在哪個(gè)平臺(tái)上運(yùn)行就需要在哪個(gè)平臺(tái)上進(jìn)行打包。
安裝pyinstaller:
python3 -m pip install --no-cache-dir pyinstaller -i https://mirrors.aliyun.com/pypi/simple/;
2.1 使用pyinstaller打包 py文件
項(xiàng)目目錄
main.py
from hello import say_hello if __name__ == '__main__': say_hello()
打包
pyinstaller --name say_hello --onedir --log-level WARN --strip --paths /leo/gme/pyinstaller_demo --distpath /leo/gme/pyinstaller_demo/package /leo/gme/pyinstaller_demo/main.py
執(zhí)行打包后的可執(zhí)行文件:
2.2 使用pyinstaller打包 Cpython編譯后的so
Cpython可以將py編譯成so文件,將編譯好的so文件以原來(lái)的工程組織形式(module)存放好,注意module下要有非編譯的__init__.py, 工程的main.py也不要編譯
pyinstaller的打包過(guò)程會(huì)從main.py走一遍所有調(diào)用的module,并打包進(jìn)去,但是編譯好的pyd不會(huì)被識(shí)別import,這就是為什么要保留原來(lái)module的__init__.py, 對(duì)于這些已經(jīng)編譯為so的module,屬于隱式import,需要在打包時(shí)加入–hidden-import
項(xiàng)目目錄
main.py
from hello import say_hello if __name__ == '__main__': say_hello()
打包
pyinstaller --hidden-import "hello" --name say_hello --onedir --log-level WARN --strip --paths /leo/gme/pyinstaller_demo --distpath /leo/gme/pyinstaller_demo/package /leo/gme/pyinstaller_demo/main.py
執(zhí)行打包后的可執(zhí)行文件:
_internal 依賴的是so文件:
三、參考資料
Cpython編譯:https://www.cnblogs.com/gcgc/p/16529975.html
Pyinstaller介紹:https://blog.csdn.net/weixin_45953322/article/details/128774685
Pyinstaller打包so文件 https://blog.csdn.net/weixin_39916966/article/details/130781599
到此這篇關(guān)于Cpython編譯后再使用Pyinstaller打包的文章就介紹到這了,更多相關(guān)Cpython編譯Pyinstaller打包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)APP自動(dòng)化發(fā)微信群消息的示例代碼
本文主要介紹了Python實(shí)現(xiàn)APP自動(dòng)化發(fā)微信群消息的示例代,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下碼2022-01-01使用Python將PDF轉(zhuǎn)換為文檔的方法實(shí)現(xiàn)
要將PDF文件轉(zhuǎn)換為Doc格式,你可以使用 Python 模塊,它將讓你輕松地將 pdf 轉(zhuǎn)換為 doc ,在本文中,我們將探索使用 Python 將 PDF 文檔轉(zhuǎn)換為Doc文件,需要的朋友可以參考下2023-09-09深入了解python的tkinter實(shí)現(xiàn)簡(jiǎn)單登錄
這篇文章主要為大家介紹了python的tkinter實(shí)現(xiàn)簡(jiǎn)單登錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2021-12-12利用pandas向一個(gè)csv文件追加寫(xiě)入數(shù)據(jù)的實(shí)現(xiàn)示例
這篇文章主要介紹了利用pandas向一個(gè)csv文件追加寫(xiě)入數(shù)據(jù)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04Python爬蟲(chóng)采集微博視頻數(shù)據(jù)
這篇文章主要介紹了利用Python爬蟲(chóng)采集微博的視頻數(shù)據(jù),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)python的小伙伴們有很好地幫助,需要的朋友可以參考下2021-12-12