欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Python編譯相關(guān)知識有哪些

小編給大家分享一下Python編譯相關(guān)知識有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

成都創(chuàng)新互聯(lián)成立十載來,這條路我們正越走越好,積累了技術(shù)與客戶資源,形成了良好的口碑。為客戶提供做網(wǎng)站、成都網(wǎng)站建設(shè)、網(wǎng)站策劃、網(wǎng)頁設(shè)計(jì)、域名注冊、網(wǎng)絡(luò)營銷、VI設(shè)計(jì)、網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。網(wǎng)站是否美觀、功能強(qiáng)大、用戶體驗(yàn)好、性價(jià)比高、打開快等等,這些對于網(wǎng)站建設(shè)都非常重要,成都創(chuàng)新互聯(lián)通過對建站技術(shù)性的掌握、對創(chuàng)意設(shè)計(jì)的研究為客戶提供一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進(jìn)步。

Python是一門能快速開發(fā)的解釋型語言

Python和Java的解釋方式對比

Java:源代碼 -> 編譯成class -> Jvm解釋運(yùn)行

Python:源代碼 -> Python解釋器解釋運(yùn)行

事實(shí)上,Python和Java的解釋方式是相同的,只是我們表面上看Python是直接解釋源代碼,而實(shí)際上python解釋器只會(huì)加載字節(jié)碼。細(xì)心的小伙伴肯定發(fā)現(xiàn)了這一點(diǎn),當(dāng)我們import某個(gè)模塊時(shí),總是會(huì)在模塊所在的目錄創(chuàng)建一個(gè)__pycache__目錄,里面存放著被加載模塊的字節(jié)碼文件

編譯源代碼有以下作用:

  1. 源代碼保護(hù)(算法保護(hù))

  2. 防止用戶篡改源代碼解釋器加載代碼速度加快

Python的幾種文件類型

py:Python控制臺程序的源代碼文件

pyw:Python帶用戶界面的源代碼文件

pyx:Python包源文件

pyc:Python字節(jié)碼文件

pyo:Python優(yōu)化后的字節(jié)碼文件

pyd:Python的庫文件(Python版DLL)、在Linux上是so文件

pyc和pyo的生成方法

pyc的作用是用來跨平臺使用的,和Java中的Class文件類似。pyc文件是一種字節(jié)碼文件,可以加快Python解釋器的加載速度,當(dāng)然也可以用來做簡單的防源碼泄露保護(hù)。

pyo則是優(yōu)化過后的字節(jié)碼文件,不過pyo更像編譯型語言里的中間文件。

我們可以通過Python提供的py_compile模塊來進(jìn)行源代碼的編譯。

py_compile模塊只提供3個(gè)方法,分別是有關(guān)編譯異常PyCompileError、有關(guān)編譯compile、有關(guān)程序入口main

我們要用到的是compile方法,compile原形如下:

compile(file, cfile=None, dfile=None, doraise=False, optimize=-1)

有5個(gè)參數(shù):

file:必選參數(shù),要編譯的源文件

cfile:編譯后的文件,默認(rèn)在源文件目錄下的__pycache__/源文件名.解釋器類型-python版本.字節(jié)碼類型

### 例如:__pycache__/abc.cpython-34.pyo

dfile:錯(cuò)誤消息文件,默認(rèn)和cfile一樣

doraise:是否開啟異常處理,默認(rèn)False

optimize:優(yōu)化字節(jié)碼級別

optimize為1時(shí),優(yōu)化字節(jié)碼級別為最高

-1和0:設(shè)置pyc優(yōu)化級別

1和2:設(shè)置pyo優(yōu)化級別

數(shù)字越小,優(yōu)化級別越高

準(zhǔn)備源文件a.py和b.py,內(nèi)容相同,就是一句print("python")代碼

編寫編譯腳本:

import py_compile

py_compile.compile(file = "a.py",cfile = "a.pyc",optimize=-1)

py_compile.compile(file = "b.py",cfile = "b.pyo",optimize=1)

運(yùn)行后可以看到已經(jīng)成功編譯成字節(jié)碼文件了,分別為a.pyc和b.pyo。

嘗試運(yùn)行這2個(gè)字節(jié)碼文件:

python a.pyc
python a.pyo

字節(jié)碼文件成功運(yùn)行。

也可以直接通過Python加載模塊來運(yùn)行:

#編譯成pyc

python -m py_compile 源代碼

#編譯成pyo

python -O -m py_compile 源代碼

這確實(shí)可以簡單地保護(hù)我們的代碼,同時(shí)似乎看起來像是加密的效果,但是要注意,這不是加密,只是把源碼變成優(yōu)化后的字節(jié)碼而已,如果想要獲得源碼,我們一樣可以通過逆向編譯來得到源碼,目前有專門逆向Python字節(jié)碼的工具存在。

如果需要編譯整個(gè)目錄內(nèi)的所有源代碼,請參考Python compileall

pyd可以讓我們的代碼更安全

如果真的想要保護(hù)代碼,為何不考慮把它變成python擴(kuò)展模塊?(目前還沒有pyd被反編譯的消息)

pyd是Python中的擴(kuò)展模塊,相當(dāng)于windows的dll,不同的是pyd只供python調(diào)用而已。

實(shí)際上,大部分的包、小模塊都是以pyd形式發(fā)布的。

如果特別感興趣的小伙伴可以深入研究下setuptools和distutils

在把源代碼轉(zhuǎn)換成功pyd之前,我們需要用到Cython包。

pip list | findstr "Cython"

檢查是否安裝了Cython,沒有請pip install Cython安裝即可

編譯pyd步驟1:生成C代碼

import Cython.Build

#導(dǎo)入Build模塊

Cython.Build.cythonize("a.py")

#a.py轉(zhuǎn)換成C代碼

cythonize運(yùn)行完成之后,無異常的情況下會(huì)在a.py的目錄下創(chuàng)建一個(gè)a.c文件,同時(shí)會(huì)返回一個(gè)distutils.extension.Extension對象列表

一定要注意的是:如果在Python Shell測試,一定要用絕對路徑,否則會(huì)ValueError異常,cythonize不會(huì)從sys.path中讀路徑。

編譯pyd步驟2:利用distutils生成pyd擴(kuò)展模塊

此時(shí)我們可以用distutils包來編譯成我們要的pyd模塊

編譯a.py成pyd

import Cython.Build

import distutils.core

a = Cython.Build.cythonize("a.py")

#返回distutils.extension.Extension對象列表

distutils.core.setup(

name = 'pyd的編譯',#包名稱

version = "1.0",#包版本號

ext_modules= a,#擴(kuò)展模塊

author = "Happyran", #作者

author_email='happyran163@163.com' #作者郵箱

)

python 執(zhí)行編譯的腳本 build

python 執(zhí)行編譯的腳本 build_ext

此時(shí)會(huì)在編譯腳本所在目錄生成一個(gè)build目錄,里面存著C語言的.def文件和.o文件,還有我們要的pyd文件

批量編譯pyd文件的誤區(qū)

此時(shí)我們已經(jīng)生成了1個(gè)pyd文件,如果我們是擴(kuò)展包/模塊的開發(fā)者,怎么批量編譯呢?

總有人會(huì)犯錯(cuò),例如以下2個(gè)例子:

a = Cython.Build.cythonize("a.py")

b = Cython.Build.cythonize("b.py")

distutils.core.setup(

...,

ext_modules= [a,b]

)

這樣做嗎?NO......

a = Cython.Build.cythonize("a.py")

a.append(Cython.Build.cythonize("b.py"))

distutils.core.setup(

...,

ext_modules= a

)

還是這樣?

犯這樣的錯(cuò)原因卻是因?yàn)椋?/p>

a = Cython.Build.cythonize("a.py")

type(a)

提示<class 'list'>

沒錯(cuò),Cython.Build.cythonize返回的是一個(gè)列表,里面只有1個(gè)distutils.extension.Extension對象

會(huì)報(bào)錯(cuò),需要1個(gè)Extension或者是2個(gè)元組

批量編譯pyd

方法1:提取我們要的Extension對象

import Cython.Build

import distutils.core

a = Cython.Build.cythonize("a.py")[0] #提取Extension對象

b = Cython.Build.cythonize("b.py")[0]

distutils.core.setup(

name = 'pyd的編譯', #包名稱

version = "1.0", #包版本號

ext_modules= [a,b], #被擴(kuò)展的模塊

author = "Happyran", #作者

author_email='happyran163@163.com' #作者郵箱

)

方法2:轉(zhuǎn)換成C代碼后再進(jìn)行Extension對象實(shí)例化

import Cython.Build

import distutils.core

Cython.Build.cythonize("a.py")

Cython.Build.cythonize("b.py")

distutils.core.setup(

name = 'pyd的編譯', #包名稱

version = "1.0", #包版本號

ext_modules= [distutils.core.Extension('a',["a.c"]),distutils.core.Extension('b', ['b.c'])], #被擴(kuò)展的模塊

#[

#distutils.core.Extension('a',["a.c"]),

#distutils.core.Extension('b', ['b.c'])

#]

author = "Happyran", #作者

author_email='happyran163@163.com' #作者郵箱

)

pyc和pyo相對而言安全性較低,pyd是目前解決Python開發(fā)中代碼安全性最優(yōu)的一個(gè)方案。

但是要注意一點(diǎn):無論是pyc還是pyo、pyd,都是跟著Python版本走的,不要指望Python2.7的東西在Python3上完美運(yùn)行。

PS:如果遇到running build...提示,刪掉build目錄重新編譯即可。

以上是“Python編譯相關(guān)知識有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

分享題目:Python編譯相關(guān)知識有哪些
當(dāng)前地址:http://chinadenli.net/article12/gjoigc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)微信公眾號、靜態(tài)網(wǎng)站、自適應(yīng)網(wǎng)站網(wǎng)頁設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司