python利器的編譯怎麼用
Ⅰ python怎樣使用解釋器
大學里計算機科學最吸引我的地方就是編譯器。最神奇的是,編譯器是如何讀出我寫的那些爛代碼,並且還能生成那麼復雜的程序。當我終於選了一門編譯方面的課程時,我發現這個過程比我想的要簡單得多。
在本系列的文章中,我會試著通過為一種基本命令語言IMP寫一個解釋器,來展示這種簡易性。因為IMP是一個簡單廣為人知的語言,所以打算用 Python寫這個解釋器。Python代碼看起來很像偽代碼,所以即使你不認識 Python,你也能理解它。解析可以通過一套從頭開始實現的解析器組合完成(在本系列的下一篇文章中會有解釋)。除了sys(用於I/O)、re(用於解析正則表達式)以及unittest(用於確保一切工作正常)庫,沒有使用其他額外的庫。
IMP 語言
在開始寫之前,我們先來討論一下將要解釋的語言。IMP是擁有下面結構的最小命令語言:
賦值語句(所有變數都是全局的,而且只能存儲整數):
Python
1
x := 1
條件語句:
Python
1
2
3
4
5
if x = 1 then
y := 2
else
y := 3
end
while循環:
Python
1
2
3
while x < 10 do
x := x + 1
end
復合語句(分號分隔):
Python
1
2
x := 1;
y := 2
OK,所以它只是一門工具語言,但你可以很容易就把它擴展成比Lua或python更有用的語言。我希望能把這份教程能保持盡量簡單。
下面這個例子是計算階乘的程序:
Python
1
2
3
4
5
6
n := 5;
p := 1;
while n > 0 do
p := p * n;
n := n - 1
end
IMP沒有讀取輸入的方式,所以初始狀態必須是在程序最開始寫一系列的賦值語句。也沒有列印結果的方式,所以解釋器必須在程序的結尾列印所有變數的值。
解釋器的結構
解釋器的核心是「中間表示」(Intermediate representation,IR)。這就是如何在內存中表示IMP程序。因為IMP是一個很簡單的語言,中間表示將直接對應於語言的語法;每一種表達和語句都有對應的類。在一種更復雜的語言中,你不僅需要一個「語法表示」,還需要一個更容易分析或運行的「語義表示」。
解釋器將會執行三個階段:
將源碼中的字元分割成標記符(token)
將標記符組織成一棵抽象語法樹(AST)。抽象語法樹就是中間表示。
評估這棵抽象語法樹,並在最後列印這棵樹的狀態
將字元串分割成標記符的過程叫做「詞法分析」,通過一個詞法分析器完成。關鍵字是很短,易於理解的字元串,包含程序中最基本的部分,如數字、標識符、關鍵字和操作符。詞法分析器會除去空格和注釋,因為它們都會被解釋器忽略。
實際執行這個解析過的抽象語法樹的過程稱為評估。這實際上是這個解析器中最簡單的部分了。
本文會把重點放在詞法分析器上。我們將編寫一個通用的詞彙庫,然後用它來為IMP創建一個詞法分析器。下一篇文章將會重點打造一個語法分析器和評估計算器。
詞彙庫
詞法分析器的操作相當簡單。它是基於正則表達式的,所以如果你不熟悉它們,你可能需要讀一些資料。簡單來說,正則表達式就是一種能描述其他字元串的特殊的格式化的字元串。你可以使用它們去匹配電話號碼或是郵箱地址,或者是像我們遇到在這種情況,不同類型的標記符。
詞法分析器的輸入可能只是一個字元串。簡單起見,我們將整個輸入文件都讀到內存中。輸出是一個標記符列表。每個標記符包括一個值(它代表的字元串)和一個標記(表示它是一個什麼類型的標記符)。語法分析器會使用這兩個數據來決定如何構建一棵抽象語法樹。
由於不論何種語言的詞法分析器,其操作都大同小異,我們將創建一個通用的詞法分析器,包括一個正則表達式列表和對應的標簽(tag)。對每一個表達式,它都會檢查是否和當前位置的輸入文本匹配。如果匹配,匹配文本就會作為一個標記符被提取出來,並且被加上該正則表達式的標簽。如果該正則表達式沒有標簽,那麼這段文本將會被丟棄。這樣免得我們被諸如注釋和空格之類的垃圾字元干擾。如果沒有匹配的正則表達式,程序就要報錯並終止。這個過程會不斷循環直到沒有字元可匹配。
下面是一段來自詞彙庫的代碼:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import sys
import re
def lex(characters, token_exprs):
pos = 0
tokens = []
while pos < len(characters):
match = None
for token_expr in token_exprs:
pattern, tag = token_expr
regex = re.compile(pattern)
match = regex.match(characters, pos)
if match:
text = match.group(0)
if tag:
token = (text, tag)
tokens.append(token)
break
if not match:
sys.stderr.write('Illegal character: %sn' % characters[pos])
sys.exit(1)
else:
pos = match.end(0)
return tokens
注意,我們遍歷正則表達式的順序很重要。lex會遍歷所有的表達式,然後接受第一個匹配成功的表達式。這也就意味著,當使用詞法分析器時,我們應當首先考慮最具體的表達式(像那些匹配運算元(matching operator)和關鍵詞),其次才是比較一般的表達式(像標識符和數字)。
詞法分析器
給定上面的lex函數,為IMP定義一個詞法分析器就非常簡單了。首先我們要做的就是為標記符定義一系列的標簽。IMP只需要三個標簽。RESERVED表示一個保留字或操作符。INT表示一個文字整數。ID代表標識符。
Python
1
2
3
4
5
import lexer
RESERVED = 'RESERVED'
INT= 'INT'
ID = 'ID'
接下來定義詞法分析器將會用到的標記符表達式。前兩個表達式匹配空格和注釋。它們沒有標簽,所以 lex 會丟棄它們匹配到的所有字元。
Python
1
2
3
token_exprs = [
(r'[ nt]+',None),
(r'#[^n]*', None),
然後,只剩下所有的操作符和保留字了。記住,每個正則表達式前面的「r」表示這個字元串是「raw」;Python不會處理任何轉義字元。這使我們可以在字元串中包含進反斜線,正則表達式正是利用這一點來轉義操作符比如「+」和「*」。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
(r':=', RESERVED),
(r'(',RESERVED),
(r')',RESERVED),
(r';', RESERVED),
(r'+',RESERVED),
(r'-', RESERVED),
(r'*',RESERVED),
(r'/', RESERVED),
(r'<=',RESERVED),
(r'<', RESERVED),
(r'>=',RESERVED),
(r'>', RESERVED),
(r'=', RESERVED),
(r'!=',RESERVED),
(r'and', RESERVED),
(r'or',RESERVED),
(r'not', RESERVED),
(r'if',RESERVED),
(r'then',RESERVED),
(r'else',RESERVED),
(r'while', RESERVED),
(r'do',RESERVED),
(r'end', RESERVED),
最後,輪到整數和標識符的表達式。要注意的是,標識符的正則表達式會匹配上面的所有的保留字,所以它一定要留到最後。
Python
1
2
3
(r'[0-9]+',INT),
(r'[A-Za-z][A-Za-z0-9_]*', ID),
]
既然正則表達式已經定義好了,我們還需要創建一個實際的lexer函數。
Python
1
2
def imp_lex(characters):
return lexer.lex(characters, token_exprs)
如果你對這部分感興趣,這里有一些驅動代碼可以測試輸出:
Python
1
2
3
4
5
6
7
8
9
10
11
import sys
from imp_lexer import *
if __name__ == '__main__':
filename = sys.argv[1]
file = open(filename)
characters = file.read()
file.close()
tokens = imp_lex(characters)
for token in tokens:
print token
繼續……
在本系列的下一篇文章中,我會討論解析器組合,然後描述如何使用他們從lexer中生成的標記符列表建立抽象語法樹。
如果你對於實現IMP解釋器很感興趣,你可以從這里下載全部的源碼。
在源碼包含的示例文件中運行解釋器:
Python
1
python imp.py hello.imp
運行單元測試:
Python
1
python test.py
Ⅱ python ide怎麼編譯運行
Python IDE
本文為大家推薦幾款款不錯的Python IDE(集成開發環境),比較推薦 PyCharm,當然你可以根據自己的喜好來選擇適合自己的 Python IDE。
PyCharm
PyCharm 是由 JetBrains 打造的一款 Python IDE。
PyCharm 具備一般Python IDE的功能,比如:調試、語法高亮、項目管理、代碼跳轉、智能提示、自動完成、單元測試、版本控制等。
另外,PyCharm 還提供了一些很好的功能用於 Django 開發,同時支持 Google App Engine,更酷的是,PyCharm 支持 IronPython。
PyCharm 官方下載地址:
效果圖查看:
Ⅲ Python程序代碼混淆、編譯、打包、運行(桌面程序防破解向)
像Python這種解釋性的語言,要想私有化部署的同時又保護好源碼,就像是對於魚和熊掌的追求。
雖然做不到盡善盡美,但是對代碼進行混淆,增加一點破解的難度,或許能規避一些泄露的風險。
本次演示環境:linux
確保要發布的包根目錄("demo")中有__main__.py文件,這個是程序執行入口。
編譯
批量改名.pyc文件
移動.pyc文件
清理.py文件
清理__pycache__文件夾
打包成zip
運行時只要將zip文件作為參數即可
最終整合腳本
調用方式
對於在變數和函數名上的混淆有點小兒科,而對於跨文件的類名的混淆又太容易實現。
所以對於混淆程度的取捨,要視工程的規模而定。
2.1 混淆工具pyminifier
在原來的工具 pyminifier上修復了幾個bug。
安裝:
python3 安裝
或者clone下來,自行安裝
使用例子
2.2 源碼變更
不同的配置對於源碼的要求不同,以下是筆者踩過的坑。
其他混淆想法
結合混淆、編譯和打包,嘗試出以下發布腳本。
主要的思路 :創建一個工作目錄tmp,然後在此目錄下混淆、編譯python代碼,完成後把內容打包成pyc文件,再將pyc文件和其他配置文件移動到dist,發布dist即可。
混淆的目的是最大程度保護源碼,在發布到客戶端後不被輕易破解。
Ⅳ Python最好IDE Pycharm使用小技巧總結
Python最好IDE:Pycharm使用小技巧總結:
1、pycharm的設置
從file下的setting進入設置,
然後我們進入到設置界面,首先我們可以設置界面的風格和工具欄字體大小,如紅線所示
接下來我們一般會設置寫代碼時的字體風格,選擇合適的字體和大小以及間隔,有利於編寫程序時的心情舒暢,寫起來一溜溜的。。。
接下來我們需要指定我們的編碼形式,這樣有利於我們的代碼編譯書寫
畢竟utf-8編解碼模式符合中國人的編碼習慣,再接下來我們希望在每次寫代碼時可以在文件頭寫上一些關於本文件的信息,例如時間、編譯器等等,這樣我們可以編寫一個書寫
template,這樣每次新建一個文件會自動在文件頭為我們添上這些信息,這里以py文件為例,可以照著這個模式來寫
為了方便,我就講它們直接敲出來了,可以直接復制啦!
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:albert time:${DATE}
接下來就是重頭戲,我們需要指定編譯器,這才是靈魂操作,
2、pycharm使用和快捷鍵
在pycharm里可以載入python使用的第三方庫,只要在指定編譯器後,點擊右邊的加號,進入搜索框找到你要載入的第三方庫即可,但是這種方式太慢了,一般我們在終端用pip結合鏡像來安裝,所以在這里就不做詳細說明。
至於快捷鍵,不同版本的可能略微有區別,常用的幾個:
注釋:選中後 Ctrl + /
定位:Ctrl + 滑鼠左鍵
縮進:Tab / Tab+shift
換行:shift + enter
編譯:Ctrl+shift+F10
查看路徑:ctrl+l (或在終端輸入pwd)
3、pycharm使用碰到的一些問題
有時候我們在寫代碼時會發現代碼下面會出現一些波浪號(非編碼錯誤),治根的辦法就是在設置里將pycharm里的檢測選項去掉
在run代碼時出現無法編譯情況
一般我們想運行代碼,可以滑鼠右鍵run一下當前文件即可,可是有時出現下面這種情況
我們需要做的就是將py文件的名字換一下即可。
更多Python知識,請關註:Python自學網!!
Ⅳ python的編譯器怎麼安裝
在各種python編譯器裡面,jupyter是最好用的一個編譯器了,占內存少,而且是在瀏覽器裡面打開。
最主要的是,它可以在同一個頁面裡面,進行多段代碼的分別調試,而互相之間不會形成干擾。
下面,我就介紹一下,怎麼安裝這款編譯器。
1、首先你要安裝好Python(此過程不做講解),然後打開命令提示符,
在命令提示符裡面輸入:pip install jupyter
點擊回車,電腦就會開始自動安裝jupyter編譯器。
安裝的東西很多,如果要自己手動安裝的話,是很繁瑣的。
安裝完成之後,在命令提示符裡面輸入:jupyter notebook
按回車,就可以打開jupyter編譯器了。
注意,這個命令提示符不要提前關閉,否則jupyter編譯器就會失效。
更多Python相關技術文章,請訪問Python教程欄目進行學習!以上就是小編分享的關於python的編譯器怎麼安裝的詳細內容希望對大家有所幫助,更多有關python教程請關注環球青藤其它相關文章!
Ⅵ 如何編譯Python使之成為可執行程序
Python是一個強大的工具,可惜不是每個人的計算機裡面都有安裝。當您寫了一個好用的工具。要如何讓那些沒有安裝Python的人使用你的工具呢?
對於這樣一個需要standalone exectuable環境的需求,直到撰寫經驗為止,只看到兩個比較好用且有持續維護的套件。一個是py2exe。另外一個就是本經驗要介紹的PyInstaller。
1
PyInstaller安裝
2
最新版本:PyInstaller 2.0
3
直接「解壓縮」之後即可使用,解壓到您想讓他在的路徑即可
END
PyInstaller配置
1
事先寫好py程序
2
在命令行執行:python Makespec.py --console --onefile NotePad\notepad.py
報錯:Configfile is missing or unreadable. Please run Configure.py before building
3
在命令行執行:Configure.py
報錯:Python 2.6+ on Windows support needs pywin32,Please install http://sourceforge.net/projects/pywin32/
4
安裝最新版本的 pywin32-217.win32-py2.7.exe
END
PyInstaller使用
命令行中運行
目錄切換到PyInstaller的安裝目錄「E:\pyinstaller-1.5\pyinstaller-1.
在PyInstaller的安裝目錄下新建一個文件夾(比如NotePad), 然後將要轉換的py腳本放到文件夾里(notepad.py)
E:\pyinstaller-1.5\pyinstaller-1.5>python Makespec.py --console --onefile NotePad\notepad.py
E:\pyinstaller-1.5\pyinstaller-1.5>python Build.py NotePad\notepad.spec
驗證exeE:\pyinstaller-1.5\pyinstaller-1.5>
E:\pyinstaller-1.5\pyinstaller-1.5\NotePad\dist\notepad.exe 0 0 100(成功)
查看生成的文件,生成的中間文件spec
查看生成的文件,生成的最終文件exe
END
注意事項
在轉換之前要確保py程序可以正常通過
如果轉換過程中出現什麼錯誤,用搜索引擎搜索解決一下
Ⅶ 怎麼用codeblocks打開python代碼並編譯運行
環境配置:
使用IDE: Code::Blocks,在編譯時需要連接python的庫,setting->complier and debugger setting->Linker setting->Link Libraries, 增加兩個庫python25.lib, libpython25.lib。 或者在Build option裡面設置linker setting也可。