1、CPython
是Python語言規范的參考實現,能夠優先獲得Python語言的最新、最強的功能,CPython是由C語言編寫而成,不但可以從Python代碼中調用C代碼的函數,還可以直接在Python中使用大量現有的C代碼庫。
2、Brython
Brython可用於在瀏覽器中運行包含了Python 3腳本的Web應用。
3、PyPy Python
雖然第一個推薦的是在Python中使用最廣泛的編譯器,但卻不是最快的,PyPy採用的是即時的編譯概念,在代碼執行前,就直接編譯為機器代碼,因此其執行速度提高了近4倍。
4、Jython或JPython
使用率第二高,Jython最初被稱為JPython,是通過Python語言來實現Java虛擬機的,開發者既可以將現有的Java包和代碼庫,導入自己的Python程序中,還可以在Java程序中嵌入Python腳本。
5、Cython
Cython與CPython不同,更像是一個超集,允許開發者在代碼中結合C和Python,從而生成C語言代碼類型的輸出,以供任何一種C/C++編譯器進行後續編譯。
6、Skulpt
流行的速度非常快,主要目的是提供一種良好的在線式Python編譯器,也可以通過讓Web應用引擎包含Skulpt,以方便開發者編寫出被用於前端的Python腳本。
7、PyJS
是另一款完全用Python去開發Web應用的編譯工具,在後台,PyJS會在使用內置的Ajax框架之前,將Python代碼編譯為JavaScript。
8、WinPython
是Python的"即用型"發行版,也就意味著用戶無需安裝,即可在Windows
PC上運行,作為另一種Python的實現,WinPython編譯器不僅帶來了Python執行環境,而且還包含了諸如:Scipy、Numpy、以及Pandas等各種Python庫。
『貳』 python是編譯器還是解釋器
其實Python和Java/C#一樣,也是一門基於虛擬機的語言
Python是編譯+解釋型的語言,執行的時候是由Python解釋器,逐行編譯+解釋,然後運行,因為在運行的過程中,需要編譯+解釋,所以Python的運行性能會低於編譯型語言,比如C++。為了提高性能,Python解釋器,會將模塊(以後要重用的腳本文件放在模塊里)的編譯+解釋的結果,保存在.pyc中。這樣下次執行的時候,就省了編譯這個環節。提高性能。一次性的腳本文件,解釋器是不會保存編譯+解釋的結果,也就是沒有.pyc文件。
希望這個回答可以幫助到你。
『叄』 python編譯器怎麼跟mingw installer 安裝的關聯起來
使用MinGW 編譯python擴展模塊
MinGW:一個可自由使用和自由發布的Windows特定頭文件和使用GNU工具集導入庫的集合,
允許你生成本地的Windows程序而不需要第三方C運行時庫。說白了就是在windows環境下
提供一套GNU工作環境。
1、下載mingw-get
下載地址
2、 安裝gcc
mingw-get install gcc
3、安裝mingw32-make
mingw-get install mingw32-make
4、添加mingw/bin到path變數中
5、指定編譯器為mingw32
python setup.py build -c mingw32 install
python setup.py build --complier=mingw32 install
或者修改site.cfg中添加或修改
[build]
compiler = mingw32
或者在lib\distutils\distutils.cfg添加或修改
[build]
compiler = mingw32
上面幾種方結果一樣只是操作過程中影響的范圍不同而已.
『肆』 為什麼編譯的Python模塊,但不是腳本正在運行
文件是在導入編譯。 這不是一個安全的事情。 這僅僅是如果你將其導入蟒蛇保存輸出。 看到這個帖子由Fredrik Lundh開發上Effbot。
>>>import main
# main.pyc is created
當運行一個腳本巨蟒將不使用* .pyc文件的文件。 如果你有你想要你的腳本一些其他的原因,預編譯可以使用compileall模塊。
python -m compileall .
compileall用法
python -m compileall --help
option --help not recognized
usage: python compileall.py [-l] [-f] [-q] [-d destdir] [-x regexp] [directory ...]
-l: don't recurse down
-f: force rebuild even if timestamps are up-to-date
-q: quiet operation
-d destdir: purported directory name for error messages
if no directory arguments, -l sys.path is assumed
-x regexp: skip files matching the regular expression regexp
the regexp is searched for in the full path of the file
回答以下問題編輯
如果響應是潛在的磁碟許可權的目錄main.py,為什麼Python的編譯模塊?
模塊和腳本將被視為相同。 進口是什麼觸發要保存的輸出。
如果原因是好處將是最小的,可以考慮的情況時,該腳本將被用於大量的時間(諸如在一個CGI應用程序)。
使用compileall不解決這個問題。 由蟒蛇執行的腳本將不使用*.pyc,除非明確要求。 這有負面影響,深受格倫·梅納德在他的回答說。
CGI應用程序的給出的例子確實應該使用像FastCGI的技術來解決。 如果你想消除編譯腳本的開銷,可能要消除啟動蟒蛇太大,何況資料庫連接開銷的開銷。
光引導腳本可以用來甚至python -c "import script",但這些都值得商榷的風格。
格倫·梅納德提供一些靈感來糾正和改進這個答案。
似乎沒有人想這樣說,但我敢肯定的答案很簡單:有這種行為沒有堅實的理由。
所有到目前為止所提出的理由基本上是不正確的:
沒有什麼特別的主文件。 它作為一個模塊載入,並顯示了sys.moles像任何其他模塊。 運行主腳本無非就是用的模塊名稱導入更__main__。
有與沒有保存.pyc文件由於只讀目錄中的文件沒有問題; 蟒蛇簡單地忽略它,並在移動。
緩存腳本的好處是相同緩存任何模塊的:不浪費時間每次它的運行時間重新編譯腳本。 該文檔明確地承認這一點(「因此,腳本的啟動時間可能會減少......」)。
另一個問題需要注意:如果您運行python foo.py和foo.pyc存在,它不會被使用。你必須明確地說,python foo.pyc。 這是一個非常糟糕的主意:它意味著當它是不同步的Python不會自動重新編譯的.pyc文件的文件(由於.py文件變化),因此對.py文件的更改將不會使用,直到您手動重新編譯。 它也將與拋出一個RuntimeError徹底失敗如果升級的Python和.pyc文件的文件格式不再兼容,這經常發生。 通常情況下,這是所有透明地處理。
你不應該需要一個腳本移動到一個虛擬的模塊,並成立了引導腳本欺騙的Python到其高速緩存。 這是一個hackish的解決方法。
唯一可能(而且非常缺乏說服力)我之所以能湊合是避免從一堆pyc文件被雜亂的主目錄。 (這不是真正的理由;如果這是一個實際的問題,則pyc文件應保存為點文件)。這當然沒有理由不甚至有一個選項來做到這一點。
蟒絕對應該能夠緩存主模塊。
以來:
當它從.pyc文件或.pyo文件時,它是從一個.py文件閱讀不是閱讀程序不會跑得更快; 這是關於.pyc文件或.pyo文件的速度的唯一事情就是與它們載入速度。
這是不必要的,以產生用於主腳本pyc文件的文件。 只有那些可能會被載入多次圖書館應編制。
編輯:
這似乎你沒明白我的意思。 首先,認識到編制的整體思路.pyc文件也作出了同樣的文件在第二次執行速度更快。 然而,考慮是否做的Python編譯腳本正在運行。 解釋器將位元組碼寫入到一個.pyc的文件在第一次運行,這需要時間。 因此,它甚至會運行有點慢。 你可能會認為它會更快之後運行。 好吧,這只是一個選擇。 此外,作為this說:
明確優於隱式。
如果想通過使用加速.pyc的文件,應該手動編譯並運行.pyc明確文件。
要回答你的問題,參考6.1.3。 「編譯」Python文件在Python正式文件。
當腳本由命令行上給出它的名字運行,腳本的位元組碼不會被寫入一個.pyc文件或.pyo文件。 因此,腳本的啟動時間可通過移動它的大部分代碼的一個模塊,並具有導入這個模塊一小啟動腳本減少。 另外,也可以命名.pyc文件或直接.pyo文件的命令行上。
教育學
讓我又愛又恨類似這樣的問題上如此,因為有感情,意見的復雜混合物,和受過教育的猜測事情,人們開始變得snippy,不知何故每個人都失去了賽道的實際情況,最終失去了軌道原題的共。
這么多的技術問題都至少有一個明確的答案,但這些「為什麼」的問題往往沒有隻是一個單一的,確定的答案(例如,可以通過執行或引用權威人士的答案來驗證答案)。 在我看來,有兩個可能的方式來明確回答計算機科學「為什麼」的問題:
通過指向一個實現所關注的項目的源代碼。 這就解釋了「為什麼」從技術角度來看:什麼前提條件是必要的,以喚起這種行為?
通過指向人類可讀的文物(注釋,提交信息,郵件列表等)由參與作出該決定的開發人員編寫的。 這就是「為什麼」,我假設OP是感興趣的真正意義:為什麼Python的開發人員使這種看似隨意的決定?
第二種回答是更加難以證實,因為它需要獲得在誰寫的代碼開發者的心,特別是如果沒有容易找到,公開文件中的特定行為的決定。
迄今為止,這個討論有7回答是只專注於閱讀的Python的開發者的意圖,但只有一個在整批引用。 (它引用了不回答OP的問題了Python手冊的部分。)
這是我在與沿引用既回答了「為什麼」的問題兩側的嘗試。
源代碼
什麼是觸發.pyc文件編制的前提條件? 讓我們來看看源代碼。 (煩人,在GitHub上Python沒有發布任何標記,所以我就告訴你,我在尋找715a6e)。
有在希望的代碼import.c:989在load_source_mole()函數。 我在這里切出一些位為簡潔起見。
static PyObject *
load_source_mole(char *name, char *pathname, FILE *fp)
{
// snip...
if (/* Can we read a .pyc file? */) {
/* Then use the .pyc file. */
}
else {
co = parse_source_mole(pathname, fp);
if (co == NULL)
return NULL;
if (Py_VerboseFlag)
PySys_WriteStderr("import %s # from %s
",
name, pathname);
if (cpathname) {
PyObject *ro = PySys_GetObject("dont_write_bytecode");
if (ro == NULL || !PyObject_IsTrue(ro))
write_compiled_mole(co, cpathname, &st);
}
}
m = PyImport_ExecCodeMoleEx(name, (PyObject *)co, pathname);
Py_DECREF(co);
return m;
}
pathname是路徑模塊和cpathname是相同的路徑,但是用pyc文件擴展名。 唯一的直接邏輯是布爾sys.dont_write_bytecode。 邏輯的其餘部分就是錯誤處理。 因此,我們所尋求的答案不在這里,但我們至少可以看到,調用此的任何代碼將導致在大多數默認配置的.pyc文件的文件。 該parse_source_mole()函數沒有真正意義要執行的流程,但我會在這里顯示,因為我會回來稍後。
static PyCodeObject *
parse_source_mole(const char *pathname, FILE *fp)
{
PyCodeObject *co = NULL;
mod_ty mod;
PyCompilerFlags flags;
PyArena *arena = PyArena_New();
if (arena == NULL)
return NULL;
flags.cf_flags = 0;
mod = PyParser_ASTFromFile(fp, pathname, Py_file_input, 0, 0, &flags,
NULL, arena);
if (mod) {
co = PyAST_Compile(mod, pathname, NULL, arena);
}
PyArena_Free(arena);
return co;
}
這里的顯著的方面是,函數解析和編譯的文件,並返回一個指針的位元組代碼(如果成功)。
現在,我們仍處於一個死胡同,讓我們處理這個從一個新的角度。 如何Python中載入它的參數,並執行它? 在pythonrun.c有用於從文件載入代碼並執行它的幾個功能。PyRun_AnyFileExFlags()可以處理互動式和非互動式的文件描述符。 對於互動式的文件描述符,它委託給PyRun_InteractiveLoopFlags()這是REPL)和非互動式的文件描述符,它委託給PyRun_SimpleFileExFlags()PyRun_SimpleFileExFlags()檢查文件名 中結束.pyc。 如果這樣做的話,就調用run_pyc_file()直接載入編譯位元組碼從一個文件描述符然後運行它。
在更常見的情況下(即.py文件作為參數),PyRun_SimpleFileExFlags()調用PyRun_FileExFlags()這是我們開始找到了答案。
PyObject *
PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals,
PyObject *locals, int closeit, PyCompilerFlags *flags)
{
PyObject *ret;
mod_ty mod;
PyArena *arena = PyArena_New();
if (arena == NULL)
return NULL;
mod = PyParser_ASTFromFile(fp, filename, start, 0, 0,
flags, NULL, arena);
if (closeit)
fclose(fp);
if (mod == NULL) {
PyArena_Free(arena);
return NULL;
}
ret = run_mod(mod, filename, globals, locals, flags, arena);
PyArena_Free(arena);
return ret;
}
static PyObject *
run_mod(mod_ty mod, const char *filename, PyObject *globals, PyObject *locals,
PyCompilerFlags *flags, PyArena *arena)
{
PyCodeObject *co;
PyObject *v;
co = PyAST_Compile(mod, filename, flags, arena);
if (co == NULL)
return NULL;
v = PyEval_EvalCode(co, globals, locals);
Py_DECREF(co);
return v;
}
這里的突出的一點是,這兩個函數基本上執行相同的目的,進口商的load_source_mole()和parse_source_mole()它調用解析器創建從Python源代碼的AST,然後調用編譯器創建位元組碼。
那麼,這些代碼塊多餘的還是他們的目的不同? 不同的是,一個塊載入從文件的模塊,而其他塊使用的是模塊作為參數。該模塊的說法是-在這種情況下-在__main__模塊,它使用的是低級別的C函數早些時候在初始化過程中創建的。 該__main__模塊不通過最正常的模塊導入代碼路徑,因為它是如此獨特,並且作為一個副作用,它不通過產生代碼去.pyc的文件。
總結:為什麼原因__main__。模塊未編譯.pyc文件是它是不是「進口」是的,它出現在sys.moles中,但它通過不是真正的模塊導入採取了非常不同的代碼路徑到達那裡。
開發者意圖
好了,我們現在可以看到的行為更多的是與Python的設計比在源代碼中任何明確表達的理由,但是這並沒有回答這是否是一種有意的決定,或只是一個副作用的問題這不打擾任何人足以成為值得改變。 一個開源的好處是,一旦我們發現我們感興趣的源代碼,我們可以使用VCS幫助追溯,導致目前實施的決定。
其中代碼的關鍵行這里(m = PyImport_AddMole("__main__");)的歷史可以追溯到1990年,並在自己BDFL,圭多寫的。 它已被修改,在干預的歲月,但修改是膚淺的。 當它第一次寫,一個腳本參數主模塊初始化是這樣的:
int
run_script(fp, filename)
FILE *fp;
char *filename;
{
object *m, *d, *v;
m = add_mole("`__main__`");
if (m == NULL)
return -1;
d = getmoledict(m);
v = run_file(fp, filename, file_input, d, d);
flushline();
if (v == NULL) {
print_error();
return -1;
}
DECREF(v);
return 0;
}
這之前存在.pyc的文件甚至被引入到Python的! 難怪當時的設計沒有考慮匯編成賬戶腳本參數。 提交信息神秘地說:
「編譯」版本
這是幾十的一個承諾,在3天的時間......看來,圭多是深入到一些黑客/重構,這是一回到是穩定的第一個版本。 這種承諾甚至五年左右早於Python的開發郵件列表的創建!
保存編譯的位元組碼引入以後6個月,於1991年。
這仍然早於列表服務,所以我們有一個什麼樣圭多想沒有真正的想法。 看來,他只是認為,進口商為掛接到緩存位元組碼的目的,最好的地方。 他是否考慮做同樣為理念__main__不清:要麼沒有想到他,不然他認為這是更多的麻煩比它的價值。
我無法找到要緩存為主要模塊的位元組碼相關的bugs.python.org任何錯誤,也可以找到關於它的郵件列表上的任何消息,因此,顯然沒有人認為這是值得的麻煩嘗試添加它。
總結:為什麼所有模塊編譯的緣故.pyc除了__main__是,它是歷史的怪癖如何設計和實現。__main__被作品烤成代碼前.pyc的文件,即使存在。 如果你想知道的多的是,你需要電子郵件圭多和要求。
格倫·梅納德的回答說:
似乎沒有人想這樣說,但我敢肯定的答案很簡單:有這種行為沒有堅實的理由。
我同意100%。 有間接證據來支持這一理論,沒有人在這個線程別人提供的證據來支持任何其他理論的一個切絲。 我upvoted格倫的回答。
因為劇本正在運行可能會在某處是不恰當的生成pyc文件,如/usr/bin。
『伍』 怎樣下載python編譯器
下載python編譯器的方法:首先進入python官網,找到合適的版本進行下載;然後運行安裝程序,設置安裝路徑,並選擇將python添加到環境變數中;最後等待安裝完成即可。
安裝方法:
(推薦教程:Python入門教程)
首先進入官網,找到合適的版本下載。
然後運行安裝程序,在Windows上面安裝比較簡單,就一直點下一步就可以了。
第一個框選是為所有用戶安裝,第二個框選的是將Python添加到環境變數
當選擇allUser時會將python安裝到 C:Program Files (x86)目錄下面,否則是按照上面圖片的位置安裝。
最後打開控制台,執行python命令即可進入python環境。
『陸』 Python編譯器運行不了
這個絕了,這個是模塊里報錯了,可能是版本兼容問題,你改不明白源碼的,我建議你如果是Python3就用urllib.request模塊,Python2用urllib和urllib2
『柒』 學習Python建議用什麼編譯器
LLVM後端的numba和支持大部分C++編譯器作為後端的nuitka。
Python由荷蘭數學和計算機科學研究學會的Guido van Rossum於1990 年代初設計,作為一門叫做ABC語言的替代品。
Python提供了高效的高級數據結構,還能簡單有效地面向對象編程。Python語法和動態類型,以及解釋型語言的本質,使它成為多數平台上寫腳本和快速開發應用的編程語言,隨著版本的不斷更新和語言新功能的添加,逐漸被用於獨立的、大型項目的開發。
Python解釋器易於擴展,可以使用C或C++(或者其他可以通過C調用的語言)擴展新的功能和數據類型。Python 也可用於可定製化軟體中的擴展程序語言。Python豐富的標准庫,提供了適用於各個主要系統平台的源碼或機器碼。
Python是一門跨平台的腳本語言,Python規定了一個Python語法規則,實現了Python語法的解釋程序就成為了Python的解釋器。
簡單講,編譯器就是將「一種語言(通常為高級語言)」翻譯為「另一種語言(通常為低級語言)」的程序。
一個現代編譯器的主要工作流程:源代碼 (source code) →預處理器(preprocessor) → 編譯器 (compiler) →目標代碼(object code) →鏈接器(Linker) → 可執行程序(executables)。
高級計算機語言便於人編寫,閱讀交流,維護。機器語言是計算機能直接解讀、運行的。編譯器將匯編或高級計算機語言源程序(Source program)作為輸入,翻譯成目標語言(Target language)機器代碼的等價程序。
源代碼一般為高級語言 (High-level language), 如Pascal、C、C++、Java、漢語編程等或匯編語言,而目標則是機器語言的目標代碼(Object code),有時也稱作機器代碼(Machine code)。
對於C#、VB等高級語言而言,此時編譯器完成的功能是把源碼(SourceCode)編譯成通用中間語言(MSIL/CIL)的位元組碼(ByteCode)。最後運行的時候通過通用語言運行庫的轉換,編程最終可以被CPU直接計算的機器碼(NativeCode)。
『捌』 Python編譯器是什麼解釋器是什麼
python一般是解釋執行的……就是說通常情況下是直接解釋(或者說你不知道有編譯這個過程)
python實際執行的時候會將代碼編譯成位元組碼的pyc文件(這一步是編譯,由編譯器負責)之後執行pyc當中的位元組碼(這一步是解釋器的工作,為了避免每次運行都要編譯加快速度)
『玖』 Python 編譯器與解釋器
編譯器是整體編譯再執行,而解釋器是邊解釋便執行。
舉個簡單的例子,編譯器就相當於你買了一桶海底撈,那麼所有海底撈食材都是整體「編譯」好,只要通過倒水(執行)就可以吃,而解釋器相當於你去海底撈門店,然後菜是一道一道上(一條一條解釋這是啥菜),你是一道一道放入湯中吃(執行)。
編譯器 的特點是:
解釋器 的特點是:
python的源文件通過解釋器進行模塊的載入及鏈接,然後將解釋完成的位元組碼存入內存,提供給CPU進行操作,然後寫入本地的.pyc文件,其觸發條件是判斷 是否存在.pyc文件+比較源文件與編譯的.pyc文件的時間戳
『拾』 Pycharm配置python編譯器
安裝了python且通過pip安裝selenium,打開Pycharm
輸入 from selenium import webdriver報錯,此時,需配置Pycharm(2019)使用的編譯器為自己安裝的python
方法:File->Settings->Project:xxx ->Project Interpreter
(1)選擇Show All...
(2)點擊 +,選擇Existing environment,瀏覽選擇已安裝的python