當前位置:首頁 » 編程語言 » cpython混合

cpython混合

發布時間: 2022-09-26 13:37:08

pythonc語言混編的幾種方式

C語言設計一個完整的可執行文件,然後python通過subprocess來執行該可執行文件,本質上是fork+execve。
C語言使用popen/system或者直接以系統調用級fork+exec來運行python程序也是一種混編的手段了。

❷ CPython是什麼PyPy是什麼Python和這兩個東西有什麼關系

CPython:是用C語言實現Pyhon,是目前應用最廣泛的解釋器。最新的語言特性都是在這個上面先實現,基本包含了所有第三方庫支持,但是CPython有幾個缺陷,一是全局鎖使Python在多線程效能上表現不佳,二是CPython無法支持JIT(即時編譯),導致其執行速度不及java和Javascipt等語言。於是出現了Pypy。

Pypy:是用Python自身實現的解釋器。針對CPython的缺點進行了各方面的改良,性能得到很大的提升。最重要的一點就是Pypy集成了JIT。但是,Pypy無法支持官方的C/Python API,導致無法使用例如Numpy,Scipy等重要的第三方庫。這也是現在Pypy沒有被廣泛使用的原因吧。

而PyPy與CPython的不同在於,別的一些python實現如CPython是使用解釋執行的方式,這樣的實現方式在性能上是很凄慘的。而PyPy使用了JIT(即時編譯)技術,在性能上得到了提升。

❸ 為什麼有的網站打開後域名後多個/index.html

index的意思是指示索引,所以多指網站的主頁。
下面是主流網頁編程語言:
CGI

CGI(common Gateway Interface,公共網關介面)。嚴格意義上來說並不算一種網頁編程語言。CGI是信息伺服器主機對外信息服務的標准介面,為了向客戶端提供動態信息而制定。通過專門編寫CGI腳本程序(在CGI控制下運行得程序,通常稱為CGI程序),不僅可以生成靜態的內容,而且可以生成完全無法預見的 動態的內容!比如雅虎、搜狐等搜索引擎提供的強大搜索功能便是利用CGI實現的。CGI腳本程序可以用C、C++等語言在多種平台上進行開發。無需太大修改就可以從一個平台移植到另一個平台上運行,具有很好的兼容性。

ASP與ASP.NET

ASP是微軟公司推出的意圖取代CGI的新技術。通過它,用戶可以使用幾乎所有的開發工具來創建和運行互動式的動態網頁,如返饋表單的信息收集處理、文件上傳與下載、聊天室、論壇等等,實現了CGI程序的功能介是又比CGI簡單,而且容易學習。由於ASP使用基於開放設計環境的Active X技術,用戶可以自己定義和製作組件加入其中,使自己的動態網頁具有幾乎無限的擴充能力。它還可利用ADO(Active Data Object,微軟的一種新的數據訪問模型)方便地訪問資料庫,能很好地對數據進行處理。借WINDOWS 東風,ASP得到了長足的發展。

php

PHP,一個嵌套的縮寫名稱,是英文「超級文本預處理語言」(PHP:Hypertext Preprocessor)的縮寫。PHP 是一種 HTML 內嵌式的語言,PHP與微軟的ASP頗有幾分相似,都是一種在伺服器端執行的「嵌入HTML文檔的腳本語言」,語言的風格有類似於C語言,現在被很多的網站編程人員廣泛的運用。PHP 獨特的語法混合了 C、Java、Perl 以及 PHP 自創新的語法。它可以比 CGI 或者 Perl 更快速的執行動態網頁。用PHP做出的動態頁面與其他的編程語言相比,PHP是將程序嵌入到HTML文檔中去執行,執行效率比完全生成HTML標記的CGI要高許多;與同樣是嵌入HTML文檔的腳本語言JavaScript相比,PHP在伺服器端執行,成 分利用了伺服器的性能;PHP執行引擎還會將用戶經常訪問的PHP程序駐留在內存中,其他用戶在一次訪問這個程序時就不需要誠信編譯程序了,只要直接執行內存中的代碼就可以了,這也是PHP高效率的體現之一。PHP具有非常強大的功能,所有的CGI或者JavaScript的功能PHP都能實現,而且支持幾乎所有流行的資料庫以及操作系統。

Script

腳本語言是介於HTML(HyperText Markup Language,超文本標示語言)和Java、C++和Visual Basic之類的編程語言之間的語言。它的語法和規則沒有可編譯的編程語言那樣嚴格和復雜。傳統的HTML是靜態的,為增強網頁的動態功能,一些廠商先後推出了自己的Script腳本語言,其中Netscape推出了JavaScript(for客戶端和 for服務端兩種),微軟則推出了VBScript和ASP兩種,用於伺服器端和客戶端程序的編寫。

JavaScript

JavaScript是一種基於對象(Object)和事件驅動(Event Driven)並具有安全性能的腳本語言。它與Java不同:JavaScript主要用於HTML的頁面,腳本嵌入在HTML的源碼中;而Java是一個獨立的、完整的編程語言,既可以在Web中應用,也可以用於與Web網無關的情況。另外,JavaS cript編寫的程序不必在運行前編譯,它們可以直接寫入Web頁面中並由調用它們的瀏覽器來解釋執行。這樣,一些基本交互作用就不用在伺服器端完成,提高了客戶端的響應時間。

VBScript

為了適應Internet上的應用,Microsoft公司把用於應用程序描述的Visual Basic語言壓縮成一個更合理的子集,稱為Visual Basic Scripting Edition,簡稱VBScript。它也是一種HTML嵌入腳本語言,具有易學易用等特點。如果你已了解Visual Basic或Visual Basic for Applications,就會很快熟悉VBScript。Microsoft公司將VBScript語言作為實施其ActiveX腳本化的最佳選擇,用戶可以採用小的相互操作的部件一起來完成工作,使得應用程序的功能列加強大。

Perl

Perl是Practical Extraction and Report Language(實用摘錄和報告語言)的縮寫,由Larry Wall於1986年開發成功。當初的目的主要是Unix環境下從多個文本文件中產生報表,後來成為許多程序員工具箱中最受歡迎的工具,其發展速度和Unix內核的成長速度相仿。現在Perl已經發展到5.0版本,並移植到了各種平台。

Python

是一種跨平台的開發語言,它可以運行在已知的各種操作系統之上,包括windows、Mac OS、Unix、BSD、Palm等。python是一種支持擴展的開發語言,主要的擴展變種有CPython、JPython、PerlPython。它們分別使用C、Java、Perl做它的擴展介面基礎環境的。更准確的說,Python也可以是一種 跨語言的語言。

ColdFusion

美國的一對兄弟allire,在為自己的客戶解決資料庫訪問的問題時,感覺到了cgi程序在編寫和維護上的難度是不能容忍的困難。於是,具有計算機天賦的Jeremy Allire便在1995年編寫了一種快速響應且易於編寫的動態腳本語言,叫做coldfusion,一經推出,便震撼整個網路行業。之後,兄弟倆看到了coldfusion的發展前途,便成立了Allire公司(後來被macromedia收購)。之後 的幾年,全球500強中的一半都採用了coldfusion來解決公司不同情況的問題。通過不斷的版本修改和開發者的不斷壯大,Coldfusion後來發展成為業界知名的企業級解決方案的開發首選。現在,為了產品線的統一,為了工業標準的統一,為了完全 兼容Java平台,Macromedia發布了ColdfusionMX。而眾位以前經常看到的Neo這個詞則是macromedia對於使用新一代coldfusion開發行業解決方案的編碼名稱。

Java

Java是一個由Sun公司開發而成的新一代編程語言。是近年來很流行的一種網路編程語言,它由C語言發展而來,是完全面向對象的語言。在與網路的融合中,已顯現出它的強大生命力和廣闊的前景。Java的語法簡練,學習和掌握比較容易,使用它可在各式各樣不同種機器、不同種操作平台的網路環境中開發軟體。Java正在逐步成為Internet應用的主要開發語言。它徹底改變了應用軟體的開發模式,帶來了自PC機以來又一次技術革命,為迅速發展的信息世界增添了新的活力。

您在編程實踐中是否常常碰到要為不同的系統平台重復編程(比如為Windows系統設計一套程序,UNIX系統設計一套程序)? Sun Microsystems公司的Java語言以其"一次編程,到處執行"的技術優勢,廣泛應用於Internet計算機環境下的編程應用,避免您針對不同的系統平台重復編程,減少您的企業的開發成本。

JSP

JSP(Java Server Pages,Java伺服器頁面)是在Sun Microsystems公司的倡導下,由許多公司共同參與建立的一種新的動態網頁技術標准。它在動態網頁的建設方面具有強大而特殊的功能。Sun公司應用組建「Java社團」的思想開發JSP技術。在開發JSP規范的過程中,Sun公司與許多主要的Web伺服器、Web應用伺服器和開發工具供應商,以及各種各樣富有經驗的開發團體進行合作,找到了一種適合於應用和頁面開發人員的開發方法,它具有極佳的可移植性和易用性。針對JSP的產品,Sun公司授權予工具提供商(如Macromedia)、結盟公司(如Apache,Netscape)、最終用戶、協作商及其他人。最近,Sun公司將最新版本的JSP和Java Servlet(JSP 1.1,Java Servlet 2.2)的源代碼發放給Apache,以求JSP和Apache緊密結合、共同發展。Apache,Sun公司和許多其他的公司及個人公開成立的咨詢機構更能方便任何公司和個人免費取得信息。

XML

XML開發者源於SGML的設計和應用者. 他們已經在SGML上投入了大量精力,但他們卻發現SGML 並沒有完全發揮它的作用.他們當然有其充分的理由.我們可以列舉以下幾個重要方面給大家.在這些方面SGML 帶來的影響可以說是一場革命. SGML (通用標記語言標准ISO 8879:1986)是HTML的前身技術.它是文件和文件中信息的構成主體. SGML與HTML不同.它允許用戶擴展tag集合, 允許用戶建立一定的規則. SGML所產生的tag 集合是用來描敘信息段特徵的.而HTML僅僅只是一個tag集合.所以我們可以說HTML是一個SGML的子集. 早在Seattle會議之前,Bosak和一些精心挑選的SGML結構信息專家就已向W3C提出了「網路上的SGML」計劃. W3C支持並贊助了他們的努力. 工作於1996年7月正式開始起動. 工作的早期,有較大的阻力.因為也存在反對SGML的人.一些制定XML標準的W3C代表甚至聲稱「網路上的SGML」是不可能實現.工作組(原稱「SGML編輯審議委員會」)並未退縮.他們打算讓SGML以全新的面目出現在網上,給SGML以全新的面貌,故給它命名為「可擴展標識語言」,即XML.

一般來講,網站基本上由FrontPage和Dreamweaver這兩種工具軟體架設的

❹ python 可擴展主要體現

就算你的項目中有大量的Python代碼,你也依舊可以有條不紊地通過將其分離為多個文件或模塊加以組織管理。而且你可以從一個模塊中選取代碼,而從另一個模塊中讀取屬性。更棒的是,對於所有模塊,Python的訪問語法都是相同的。不管這個模塊是Python標准庫中的還是你一分鍾之前創造的,哪怕是你用其他語言寫的擴展都沒問題!藉助這些特點,你會感覺自己根據需要「擴展」了這門語言,而且你已經這么做了。
代碼中的瓶頸,可能是在性能分析中總排在前面的那些熱門或者一些特別強調性能的地方,可以作為Python擴展用C重寫。需要重申的是,這些介面和純Python模塊的介面是一模一樣的,乃至代碼和對象的訪問方法也是如出一轍的。唯一不同的是,這些代碼為性能帶來了顯著的提升。自然,這全部取決你的應用程序以及它對資源的需求情況。很多時候,使用編譯型代碼重寫程序的瓶頸部分絕對是益處多多的,因為它能明顯提升整體性能。
程序設計語言中的這種可擴展性使得工程師能夠靈活附加或定製工具,縮短開發周期。雖然像C、C++乃至Java等主流第三代語言(3GL)都擁有該特性,但是這么容易地使用C編寫擴展確實是Python的優勢。此外,還有像PyRex這樣的工具,允許C和Python混合編程,使編寫擴展更加輕而易舉,因為它會把所有的代碼都轉換成C語言代碼。
因為Python的標准實現是使用C語言完成的(也就是CPython),所以要使用C和C++編寫Python擴展。Python 的Java實現被稱作Jython,要使用Java編寫其擴展。最後,還有IronPython,這是針對.NET或Mono平台的C#實現。你可以使用C#或者VB.Net擴展IronPython.

❺ 為什麼使用Python,Python應用場景 特點

python一般認為是腳本語言,或者說是動態語言,速度慢肯定是所有解釋性語言的缺點了,除此之外,python的多線程無法在多核上運行肯定也
是需要解決的問題,不過它最大的優點就是敏捷,堪稱敏捷開發的典範,適合的場合分兩種:專業人士來做一些有意思的事情,比如寫一些很有意思的腳本啊(黑客
必學的語言之一);非專業人士用來做一些普通的事情,比如搭個自己的網站(django)或者一般的科學計算、格式轉換等等。業界用python做web
開發其實蠻少,不過也有,web框架比較好用的就是django,比較適合快速開發程序員至少得會c語言吧,剩下的看需要。語言無所謂。只要人牛叉,什麼
語言都能寫出牛叉的程序。
-----
1. 支持OOP編程
從根本上講Python仍是一種面向對象的語言,支持多態、繼承等高級概念,在Python里使用OOP十分容易
沒有C++、Java那樣復雜,但不必做Python下OOp高手,夠用即可。
2. 免費Python的使用是完全免費的,您可以從網路上免費下載、安裝使用,
Python上的其他程序包,也可下載安裝使用。
Python的免費的同時又有很多的的社區對用戶的提問提出快速的技術支持,學習和使用Python技術不再是一個人在戰斗!
3. 可移植性
Python的實現是用ansi c編寫的,可以運行在目前所有主流平台上,手機、pad上均可運行Python程序,其下的程序包也具有可移植性。
4. 功能強大
從特性的觀點上看,Python是一個混合體,他豐富的工具集使得他介於傳統的腳本語言和系統語言之間。
------
python好不好,還在於自己的積累與感覺。如果你積累的多,游刃有餘,會覺著它很好。從一般情況來看python是腳本語言之王,十年前是這樣,十年後還是這樣。
膠水是指,python藉助C語言介面,幾乎可以驅動所有已知的軟體,模塊。 只要我們用到的,通常你都能找到一個開源的庫。安裝後就可以驅動它。無論是資料庫,網路,互聯網,圖形,游戲,科學計算,GUI,OA,自動控制,甚至宇航員都在用。

python通常不作為工程語言出現。就是正規的軟體生產不使用它。主要用java, c#, xml, c。至於為什麼,這是軟體工程的需要。python不具有完整的語法檢查。

python並不為特定目的而產生。雖然它更適用於系統維護。不過它就是一個通用的腳本語言。

從個人感覺來說,微軟體東西,非常好,省心,一流的技術理念,開發工具是全世界最好的(沒有之一)。不過,因為它只限於微軟的平台,所以范圍上大大
打了折扣。
世界上最流行的伺服器還是unix和linux。而不是windows。桌面操作系統最流行的是windows。不過在所有的平台上都有C語言,大部分平
台,甚至手機平台都有python語言和它的執行環境。這是其它的所有語言,包括java幾乎都很難做到的。

python嚴格說叫CPython,與C/c++有天然的融合性。這也是python強大的原因之一。在windows環境下可以使用
ironpython,這個版本與vc可以結合的比較好。其它的平台可以使用eclipse,不過最好還是直接使用普通的文本編輯器。比較推薦的一個編輯
器是sublime text2, geany, vi等。

python圖形化編程不難。當然MFC也不難。我不認為MFC有多難。其實學習起來只是略難,但是這不是一個數量級的。MFC可以生產出非常強勁的界面。而python界面多屬於簡單的。

虛擬機可以跑linux,配置好就可以。也可以獨立安裝一個linux。也可以直接在windows下學習python。沒有太多區別。建議你買一個200多元的樹莓派,很好玩。安裝的是linux操作系統。

IDLE是我初學,甚至幾年中用得最多的。後來有了sublime才基本上不用它。idle只有一個缺點,就是有時候程序大了,輸入鍵盤會有感覺延遲。
---
python應用的很多的呀,web的比如豆瓣,還有非常多的網頁游戲的後端。我知道的都是作為後台服務,無論開發速度還是調試之類的都很好。前端的應用產品雖然python可以實現,但是在GUI方面的開發效率還是沒有VS或者XCode快。
----
如果說c是劍,c++是刀,java是槍的話,python就是飛刀,學精了可以成為李尋歡那樣的高手,當作常規武器用,不過絕大多數人只能把飛刀當作暗器,在某些特定場合,出奇制勝
----
做web開發肯定首選php 數據挖掘首選python
--
Python的web框架很多,比如Django,webpy等 - webpy

❻ python與c++混合編程如何入門

派桑和c/c++實際上是不同的工具,一個是斧頭,一個是菜刀,各有各的用途。非要把讓菜刀能砍柴,讓斧頭能切菜,這種努力有無必要,值得考慮。
派桑常用劇本,嚕蘇,速度慢,不嚴謹,但有它的便利,例如它有 list, tuple, 之類的東西。
混合編程 常用於 提高 派桑 速度。
常用 方法 是(1)包含 Python.h 文件頭 (2)定義 派桑 的 各種對象 為 各種 c 結構
(3)派桑 的 各種對象用指針,名字用 Py 或 _Py大頭 動態分配 在 heap (4)用函數跟蹤統計 各種對象結構 的個數變化,即時 釋放內存(5)及時處理 派桑 exception
(6) 輸出為派桑的數據格式。
我沒有合起來用過,不過基本套路如此。

❼ 如何實現 C/C++ 與 Python 的通信

屬於混合編程的問題。較全面的介紹一下,不僅限於題主提出的問題。
以下討論中,Python指它的標准實現,即CPython(雖然不是很嚴格)

本文分4個部分

C/C++ 調用 Python (基礎篇)— 僅討論Python官方提供的實現方式
Python 調用 C/C++ (基礎篇)— 僅討論Python官方提供的實現方式
C/C++ 調用 Python (高級篇)— 使用 Cython
Python 調用 C/C++ (高級篇)— 使用 SWIG

練習本文中的例子,需要搭建Python擴展開發環境。具體細節見搭建Python擴展開發環境 - 蛇之魅惑 - 知乎專欄

1 C/C++ 調用 Python(基礎篇)
Python 本身就是一個C庫。你所看到的可執行體python只不過是個stub。真正的python實體在動態鏈接庫里實現,在Windows平台上,這個文件位於 %SystemRoot%\System32\python27.dll。

你也可以在自己的程序中調用Python,看起來非常容易:

//my_python.c
#include <Python.h>

int main(int argc, char *argv[])
{
Py_SetProgramName(argv[0]);
Py_Initialize();
PyRun_SimpleString("print 'Hello Python!'\n");
Py_Finalize();
return 0;
}

在Windows平台下,打開Visual Studio命令提示符,編譯命令為
cl my_python.c -IC:\Python27\include C:\Python27\libs\python27.lib

在Linux下編譯命令為
gcc my_python.c -o my_python -I/usr/include/python2.7/ -lpython2.7

在Mac OS X 下的編譯命令同上

產生可執行文件後,直接運行,結果為輸出
Hello Python!

Python庫函數PyRun_SimpleString可以執行字元串形式的Python代碼。

雖然非常簡單,但這段代碼除了能用C語言動態生成一些Python代碼之外,並沒有什麼用處。我們需要的是C語言的數據結構能夠和Python交互。

下面舉個例子,比如說,有一天我們用Python寫了一個功能特別強大的函數:

def great_function(a):
return a + 1

接下來要把它包裝成C語言的函數。我們期待的C語言的對應函數應該是這樣的:

int great_function_from_python(int a) {
int res;
// some magic
return res;
}

首先,復用Python模塊得做『import』,這里也不例外。所以我們把great_function放到一個mole里,比如說,這個mole名字叫 great_mole.py

接下來就要用C來調用Python了,完整的代碼如下:
#include <Python.h>

int great_function_from_python(int a) {
int res;
PyObject *pMole,*pFunc;
PyObject *pArgs, *pValue;

/* import */
pMole = PyImport_Import(PyString_FromString("great_mole"));

/* great_mole.great_function */
pFunc = PyObject_GetAttrString(pMole, "great_function");

/* build args */
pArgs = PyTuple_New(1);
PyTuple_SetItem(pArgs,0, PyInt_FromLong(a));

/* call */
pValue = PyObject_CallObject(pFunc, pArgs);

res = PyInt_AsLong(pValue);
return res;
}

從上述代碼可以窺見Python內部運行的方式:

所有Python元素,mole、function、tuple、string等等,實際上都是PyObject。C語言里操縱它們,一律使用PyObject *。
Python的類型與C語言類型可以相互轉換。Python類型XXX轉換為C語言類型YYY要使用PyXXX_AsYYY函數;C類型YYY轉換為Python類型XXX要使用PyXXX_FromYYY函數。
也可以創建Python類型的變數,使用PyXXX_New可以創建類型為XXX的變數。
若a是Tuple,則a[i] = b對應於 PyTuple_SetItem(a,i,b),有理由相信還有一個函數PyTuple_GetItem完成取得某一項的值。
不僅Python語言很優雅,Python的庫函數API也非常優雅。

現在我們得到了一個C語言的函數了,可以寫一個main測試它
#include <Python.h>

int great_function_from_python(int a);

int main(int argc, char *argv[]) {
Py_Initialize();
printf("%d",great_function_from_python(2));
Py_Finalize();
}

編譯的方式就用本節開頭使用的方法。
在Linux/Mac OSX運行此示例之前,可能先需要設置環境變數:
bash:
export PYTHONPATH=.:$PYTHONPATH

csh:
setenv PYTHONPATH .:$PYTHONPATH

2 Python 調用 C/C++(基礎篇)
這種做法稱為Python擴展。
比如說,我們有一個功能強大的C函數:
int great_function(int a) {
return a + 1;
}

期望在Python里這樣使用:
>>> from great_mole import great_function
>>> great_function(2)
3

考慮最簡單的情況。我們把功能強大的函數放入C文件 great_mole.c 中。
#include <Python.h>

int great_function(int a) {
return a + 1;
}

static PyObject * _great_function(PyObject *self, PyObject *args)
{
int _a;
int res;

if (!PyArg_ParseTuple(args, "i", &_a))
return NULL;
res = great_function(_a);
return PyLong_FromLong(res);
}

static PyMethodDef GreateMoleMethods[] = {
{
"great_function",
_great_function,
METH_VARARGS,
""
},
{NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC initgreat_mole(void) {
(void) Py_InitMole("great_mole", GreateMoleMethods);
}

除了功能強大的函數great_function外,這個文件中還有以下部分:

包裹函數_great_function。它負責將Python的參數轉化為C的參數(PyArg_ParseTuple),調用實際的great_function,並處理great_function的返回值,最終返回給Python環境。

出表GreateMoleMethods。它負責告訴Python這個模塊里有哪些函數可以被Python調用。導出表的名字可以隨便起,每一項有4
個參數:第一個參數是提供給Python環境的函數名稱,第二個參數是_great_function,即包裹函數。第三個參數的含義是參數變長,第四個
參數是一個說明性的字元串。導出表總是以{NULL, NULL, 0, NULL}結束。
導出函數initgreat_mole。這個的名字不是任取的,是你的mole名稱添加前綴init。導出函數中將模塊名稱與導出表進行連接。

在Windows下面,在Visual Studio命令提示符下編譯這個文件的命令是
cl /LD great_mole.c /o great_mole.pyd -IC:\Python27\include C:\Python27\libs\python27.lib

/LD 即生成動態鏈接庫。編譯成功後在當前目錄可以得到 great_mole.pyd(實際上是dll)。這個pyd可以在Python環境下直接當作mole使用。

在Linux下面,則用gcc編譯:
gcc -fPIC -shared great_mole.c -o great_mole.so -I/usr/include/python2.7/ -lpython2.7

在當前目錄下得到great_mole.so,同理可以在Python中直接使用。

本部分參考資料

《Python源碼剖析-深度探索動態語言核心技術》是系統介紹CPython實現以及運行原理的優秀教程。
Python 官方文檔的這一章詳細介紹了C/C++與Python的雙向互動Extending and Embedding the Python Interpreter
關於編譯環境,本文所述方法僅為出示原理所用。規范的方式如下:3. Building C and C++ Extensions with distutils
作為字典使用的官方參考文檔 Python/C API Reference Manual

用以上的方法實現C/C++與Python的混合編程,需要對Python的內部實現有相當的了解。接下來介紹當前較為成熟的技術Cython和SWIG。

3 C/C++ 調用 Python(使用Cython)


前面的小節中談到,Python的數據類型和C的數據類型貌似是有某種「一一對應」的關系的,此外,由於Python(確切的說是CPython)本身是
由C語言實現的,故Python數據類型之間的函數運算也必然與C語言有對應關系。那麼,有沒有可能「自動」的做替換,把Python代碼直接變成C代碼
呢?答案是肯定的,這就是Cython主要解決的問題。

安裝Cython非常簡單。Python 2.7.9以上的版本已經自帶easy_install:
easy_install -U cython

在Windows環境下依然需要Visual
Studio,由於安裝的過程需要編譯Cython的源代碼,故上述命令需要在Visual
Studio命令提示符下完成。一會兒使用Cython的時候,也需要在Visual
Studio命令提示符下進行操作,這一點和第一部分的要求是一樣的。

繼續以例子說明:
#great_mole.pyx
cdef public great_function(a,index):
return a[index]

這其中有非Python關鍵字cdef和public。這些關鍵字屬於Cython。由於我們需要在C語言中使用
「編譯好的Python代碼」,所以得讓great_function從外面變得可見,方法就是以「public」修飾。而cdef類似於Python的
def,只有使用cdef才可以使用Cython的關鍵字public。

這個函數中其他的部分與正常的Python代碼是一樣的。

接下來編譯 great_mole.pyx
cython great_mole.pyx

得到great_mole.h和great_mole.c。打開great_mole.h可以找到這樣一句聲明:
__PYX_EXTERN_C DL_IMPORT(PyObject) *great_function(PyObject *, PyObject *)

寫一個main使用great_function。注意great_function並不規定a是何種類型,它的
功能只是提取a的第index的成員而已,故使用great_function的時候,a可以傳入Python
String,也可以傳入tuple之類的其他可迭代類型。仍然使用之前提到的類型轉換函數PyXXX_FromYYY和PyXXX_AsYYY。

//main.c
#include <Python.h>
#include "great_mole.h"

int main(int argc, char *argv[]) {
PyObject *tuple;
Py_Initialize();
initgreat_mole();
printf("%s\n",PyString_AsString(
great_function(
PyString_FromString("hello"),
PyInt_FromLong(1)
)
));
tuple = Py_BuildValue("(iis)", 1, 2, "three");
printf("%d\n",PyInt_AsLong(
great_function(
tuple,
PyInt_FromLong(1)
)
));
printf("%s\n",PyString_AsString(
great_function(
tuple,
PyInt_FromLong(2)
)
));
Py_Finalize();
}

編譯命令和第一部分相同:
在Windows下編譯命令為
cl main.c great_mole.c -IC:\Python27\include C:\Python27\libs\python27.lib

在Linux下編譯命令為
gcc main.c great_mole.c -o main -I/usr/include/python2.7/ -lpython2.7

這個例子中我們使用了Python的動態類型特性。如果你想指定類型,可以利用Cython的靜態類型關鍵字。例子如下:

#great_mole.pyx
cdef public char great_function(const char * a,int index):
return a[index]

cython編譯後得到的.h里,great_function的聲明是這樣的:
__PYX_EXTERN_C DL_IMPORT(char) great_function(char const *, int);

很開心對不對!
這樣的話,我們的main函數已經幾乎看不到Python的痕跡了:
//main.c
#include <Python.h>
#include "great_mole.h"

int main(int argc, char *argv[]) {
Py_Initialize();
initgreat_mole();
printf("%c",great_function("Hello",2));
Py_Finalize();
}

在這一部分的最後我們給一個看似實用的應用(僅限於Windows):
還是利用剛才的great_mole.pyx,准備一個dllmain.c:
#include <Python.h>
#include <Windows.h>
#include "great_mole.h"

extern __declspec(dllexport) int __stdcall _great_function(const char * a, int b) {
return great_function(a,b);
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpReserved) {
switch( fdwReason ) {
case DLL_PROCESS_ATTACH:
Py_Initialize();
initgreat_mole();
break;
case DLL_PROCESS_DETACH:
Py_Finalize();
break;
}
return TRUE;
}

在Visual Studio命令提示符下編譯:
cl /LD dllmain.c great_mole.c -IC:\Python27\include C:\Python27\libs\python27.lib

會得到一個dllmain.dll。我們在Excel裡面使用它,沒錯,傳說中的Excel與Python混合編程:

參考資料:Cython的官方文檔,質量非常高:
Welcome to Cython』s Documentation

❽ 如何實現C與python混合編程

實現C與python混合編程方法
代碼如下:

/* tcpportping.c */
#include <Python.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/time.h>

/* count time functions */
static double mytime(void)
{
struct timeval tv;
if (gettimeofday(&tv, NULL) == -1)
return 0.0;

return (double)tv.tv_usec + (double)tv.tv_sec * 1000000;
}

static PyObject * /* returns object */
tcpping(PyObject *self, PyObject *args )
{
struct sockaddr_in addr;
struct hostent *hp;
double time;
char *host = NULL;
int fd;
int port, timeout;

if (!PyArg_ParseTuple(args, "sii", &host, &port, &timeout)) /* convert Python -> C */
return NULL; /* null=raise exception */

if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
return Py_BuildValue("d", -1.0); /* convert C -> Python */
}

bzero((char *)&addr, sizeof(addr));
if ((hp = gethostbyname(host)) == NULL) {
return Py_BuildValue("d", -2.0); /* convert C -> Python */
}
b(hp->h_addr, &addr.sin_addr, hp->h_length);
addr.sin_family = AF_INET;
addr.sin_port = htons(port);

struct timeval tv;

tv.tv_sec = 0;
tv.tv_usec = timeout * 1000;

double stime = mytime();
if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
return Py_BuildValue("d", -3.0); /* convert C -> Python */
}
fd_set read, write;
FD_ZERO(&read);
FD_ZERO(&write);

FD_SET(fd, &read);
FD_SET(fd, &write);

if (select(fd + 1, &read, &write, NULL, &tv) == 0) {
close(fd);
return Py_BuildValue("d", -4.0); /* convert C -> Python */
}

double etime = mytime();
time = etime - stime;
if (!FD_ISSET(fd, &read) && !FD_ISSET(fd, &write)) {
close(fd);
return Py_BuildValue("d", -4.0); /* convert C -> Python */
}
close(fd);
return Py_BuildValue("d", time/1000); /* convert C -> Python */
}

/* registration table */
static struct PyMethodDef portping_methods[] = {
{"tcpping", tcpping, METH_VARARGS}, /* method name, C func ptr, always-tuple */
{NULL, NULL} /* end of table marker */
};

/* mole initializer */
void inittcpportping( ) /* called on first import */
{ /* name matters if loaded dynamically */
(void) Py_InitMole("tcpportping", portping_methods); /* mod name, table ptr */
}

❾ Python為什麼能擴展

Python 具有高可擴展性,存在許多使用 C 語言或 Fortran 編寫擴展的方法。必要時,Python 代碼可以直接將這些擴展作為子常式來調用。這部分討論用於構建擴展的一些主要編譯器(絕對不是完整列表)。

相關推薦:《Python基礎教程》

Cython

Cython(不同於 CPython)既是指一種語言,也是指一種編譯器。Cython 語言是添加了 C 語言語法的 Python 語言的超集。Cython 可以在代碼段或完整函數中顯式釋放 GIL。變數和類屬性上的 C 類型聲明以及對 C 函數的調用都使用 C 語法。其餘部分代碼則使用 Python 語法。通過這個混合的 Cython 代碼,Cython 編譯器可生成高效的 C 代碼。任何定期優化的 C/C++ 編譯器都可以編譯此 C 代碼,從而高度優化擴展的運行時代碼,性能接近於原生的 C 代碼性能。

Numba

Numba 是一個動態、即時 (JIT) 且可感知 NumPy 的 Python 編譯器。Numba 使用 LLVM 編譯器基礎架構,生成優化的機器代碼和從 Python 調用代碼的包裝器。與 Cython 不同,編碼使用常規的 Python 語言。Numba 可讀取來自裝飾器中所嵌入注釋的類型信息,並優化代碼。對於使用 NumPy 數據結構的程序,比如數組以及許多數學函數,它可以實現與 C 或 Fortran 語言類似的性能。NumPy 對線性代數和矩陣函數使用硬體加速,利用 LAPACK 和 BLAS 提供額外加速,大大提升了性能,參見 IBM 博客文章C、Julia、Python、Numba 和 Cython 在 LU 因式分解方面的速度比較。

除 CPU 以外,Numba 還能夠使用 GP-GPU 後端。Anaconda, Inc. 是 Python 某個主要發行版的幕後公司,該公司還開發了 Numba 和商業版的 Numba Pro。

Fortran to Python Interface Generator

Fortran to Python Interface Generator (F2Py) 起初為一個獨立的程序包,現在包含在 NumPy 中。F2Py 支持 Python 調用以 Fortran 編寫的數值常式,就好像它們是另一個 Python 模塊一樣。因為 Python 解釋器無法理解 Fortran 源代碼,所以 F2Py 以動態庫文件格式將 Fortran 編譯為本機代碼,這是一種共享對象,包含具有 Python 模塊介面的函數。因此,Python 可以直接將這些函數作為子常式來調用,以原生 Fortran 代碼的速度和性能來執行。

❿ python怎麼作為c語言的擴展

1.環境配置,python3.2裝好,編譯器我直接用的devcpp的編譯器(原因是直接安裝就可以,其它的編譯器我還不會用),將devcpp的bin目錄添加到環境變數path中。
2.准備好your_mole.c文件,這是你自己的C語言寫的擴展程序,確保你的your_mole.c符合python和C的介面要求。
3.python提供了distutils模塊用來方便地將c文件轉變成pyd文件,也是筆者比較推薦的方法。准備好your_mole.c文件後,在同一目錄下創建steup.py文件,文件內容如下:

from distutils.core import setup, Extension

mole1 = Extension('your_mole_name',
sources = ['demo.c'])

setup (name = 'PackageName',
version = '1.0',
description = 'This is a demo package',
ext_moles = [mole1])
注意'your_mole_name'要跟C文件中PyInit_mole函數的'mole'一樣,否則在後續的步驟中會出錯。
4.建立steup.bat文件,內容只有兩行:
python.exe setup.py build -c mingw32
pause
5.運行steup.bat文件。
6.如果沒有錯誤,在build\lib.win32-3.2下找到生成的pyd文件,放置到PYTHONPATH的目錄中即可被import調用,到此大功告成。注意,python尋找pyd文件不是在sys.path中找,而是在PYTHONPATH指定的目錄中找。

熱點內容
app什麼情況下找不到伺服器 發布:2025-05-12 15:46:25 瀏覽:714
php跳過if 發布:2025-05-12 15:34:29 瀏覽:467
不定時演算法 發布:2025-05-12 15:30:16 瀏覽:131
c語言延時1ms程序 發布:2025-05-12 15:01:30 瀏覽:166
動物園靈長類動物配置什麼植物 發布:2025-05-12 14:49:59 瀏覽:737
wifi密碼設置什麼好 發布:2025-05-12 14:49:17 瀏覽:150
三位數乘兩位數速演算法 發布:2025-05-12 13:05:48 瀏覽:399
暴風影音緩存在哪裡 發布:2025-05-12 12:42:03 瀏覽:545
access資料庫exe 發布:2025-05-12 12:39:04 瀏覽:632
五開的配置是什麼 發布:2025-05-12 12:36:37 瀏覽:367