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