Cpython編譯后再使用Pyinstaller打包的詳細(xì)教程
一、Cpython
Python是一門解釋型語言,當(dāng)我們想讓其他人運(yùn)行我們的代碼時(shí),如果直接將.py源代碼發(fā)送給他人,那么源代碼將沒有任何安全性可言,也就是任何一個(gè)人都可以打開源代碼一看究竟,任何人都可以隨意修改源代碼。
而為了防止源代碼泄露,可以將Python源代碼編譯生成.pyd庫文件或者.so庫文件:Windows平臺(tái)生成pyd文件,Linux生成so文件。
1.1 Python有以下幾種類型的文件
py:Python控制臺(tái)程序的源代碼文件
pyw:Python帶用戶界面的源代碼文件
pyx:Python包源文件
pyc:Python字節(jié)碼文件(可通過逆向編譯來得到源碼)
pyo:Python優(yōu)化后的字節(jié)碼文件(可通過逆向編譯來得到源碼)
pyd:在Windows平臺(tái)上Python的庫文件(Python版DLL)
so:在Linux平臺(tái)上Python的庫文件是so文件
1.2 使用Cpython編譯項(xiàng)目步驟
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文件
進(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è)過程基本不可逆),再把這個(gè).c文件編譯成了pyd/so文件。
二、 Pyinstaller
pyinstaller是一個(gè)第三方庫,它能夠在Windows、Linux、 Mac OS X 等操作系統(tǒng)下將 Python 源文件打包,通過對(duì)源文件打包, Python 程序可以在沒有安裝 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文件以原來的工程組織形式(module)存放好,注意module下要有非編譯的__init__.py, 工程的main.py也不要編譯
pyinstaller的打包過程會(huì)從main.py走一遍所有調(diào)用的module,并打包進(jìn)去,但是編譯好的pyd不會(huì)被識(shí)別import,這就是為什么要保留原來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ā)微信群消息的示例代,文中通過示例代碼介紹的非常詳細(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)簡單登錄
這篇文章主要為大家介紹了python的tkinter實(shí)現(xiàn)簡單登錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2021-12-12
利用pandas向一個(gè)csv文件追加寫入數(shù)據(jù)的實(shí)現(xiàn)示例
這篇文章主要介紹了利用pandas向一個(gè)csv文件追加寫入數(shù)據(jù)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04

