python封裝api
『壹』 c++和python有哪些封裝好的win32api庫
希望找到一個模塊or庫可以讓一個沒有接觸過win32api的人快速調用它實現某些功能。
如易語言中超級模塊、精易模塊之類的模塊
python有pywin32之類的庫,似乎有點過於底層, 不夠pythonic。
個人:前端程序員,不關注底層,只是為了完成某個項目,准備用完忘掉那種。
可以直接 調用你想要的DLL,當然 通過Ctypes
『貳』 api介面和python庫的區別是什麼
API 介面屬於一種操作系統或程序介面,而後兩者都屬於直接用戶介面。 有時公司會將 API 作為其公共開放系統。也就是說,公司制定自己的系統介面標准,當需要執行系統整合、自定義和程序應用等操作時,公司所有成員都可以通過該介面標准調用源代碼,該介面標准被稱之為開放式 API。
『叄』 對於開發恆生交易API的Python封裝有什麼建議
因為一些不可抗力的原因,前一段時間開發的LTS API的Python封裝暫時用不上,目前證券API這邊剩下相對靠譜的選擇只剩恆生了,同樣是准備基於C++版本的API開發Python封裝。現在的一個問題是,恆生的API風格上和國內大多數其他API非常不同,他的請求操作和數據推送需要用戶自己發送和接收數據包並進行解析(類CTP的API會直接幫你處理好,用戶只需傳入結構體指針)。題主面臨兩個選擇:直接對恆生API進行封裝,提供數據包操作的Python介面。對恆生API進行類CTP封裝後,再封裝為Python介面,好處是可以和之前類CTP的API通用,缺點可能會損失部分恆生API獨有的功能。這個API最後同樣會整合到題主的vn.py框架中,這樣對於很多大型券商(中信、海通、招商等等),用戶也會多一個可以用Python進行量化開發的選擇。恆生的介面應用應該是最普遍的,但是用恆生介面一般都需要券商給認證文件才能使用,大多數人應該都參與不了這個項目。可以參考quantbox和wind,先在框架上統一。最好先把ctp期貨和證券做出來,畢竟興業也在用,lts也是類ctp的。恆生的介面應用應該是最普遍的,但是用恆生介面一般都需要券商給認證文件才能使用,大多數人應該都參與不了這個項目。能做到封裝後python API和現有vn.py已存在的lts和ctp的介面兼容,那就極好
『肆』 怎麼把Python代碼 轉為API
此外,Python已經內置確定序列的長度以及確定最大和最小的元素的方法。
『伍』 python如何寫api
其實就是定義一個函數或類,規范化其輸入輸出格式,給其他地方調用就是了
『陸』 如何使用python 開發一個api
使用 Python 和 Flask 設計 RESTful API
近些年來 REST (REpresentational State Transfer) 已經變成了 web services 和 web APIs 的標配。
在本文中我將向你展示如何簡單地使用 Python 和 Flask 框架來創建一個 RESTful 的 web service。
什麼是 REST?
六條設計規范定義了一個 REST 系統的特點:
客戶端-伺服器: 客戶端和伺服器之間隔離,伺服器提供服務,客戶端進行消費。
無狀態: 從客戶端到伺服器的每個請求都必須包含理解請求所必需的信息。換句話說, 伺服器不會存儲客戶端上一次請求的信息用來給下一次使用。
可緩存: 伺服器必須明示客戶端請求能否緩存。
分層系統: 客戶端和伺服器之間的通信應該以一種標準的方式,就是中間層代替伺服器做出響應的時候,客戶端不需要做任何變動。
統一的介面: 伺服器和客戶端的通信方法必須是統一的。
按需編碼: 伺服器可以提供可執行代碼或腳本,為客戶端在它們的環境中執行。這個約束是唯一一個是可選的。
- ========== ===================== ==================================
- HTTP 方法 行為 示例
- ========== ===================== ==================================
- GET 獲取資源的信息 http://example.com/api/orders
- GET 獲取某個特定資源的信息 http://example.com/api/orders/123
- POST 創建新資源 http://example.com/api/orders
- PUT 更新資源 http://example.com/api/orders/123
- DELETE 刪除資源 http://example.com/api/orders/123
- ========== ====================== ==================================
- ========== =============================================== =============================
- HTTP 方法 URL 動作
- ========== =============================================== ==============================
- GET http://[hostname]/todo/api/v1.0/tasks 檢索任務列表
- GET http://[hostname]/todo/api/v1.0/tasks/[task_id] 檢索某個任務
- POST http://[hostname]/todo/api/v1.0/tasks 創建新任務
- PUT http://[hostname]/todo/api/v1.0/tasks/[task_id] 更新任務
- DELETE http://[hostname]/todo/api/v1.0/tasks/[task_id] 刪除任務
- ========== ================================================ =============================
id: 任務的唯一標識符。數字類型。
title: 簡短的任務描述。字元串類型。
description: 具體的任務描述。文本類型。
done: 任務完成的狀態。布爾值。
- $ mkdir todo-api
- $ cd todo-api
- $ virtualenv flask
- New python executable in flask/bin/python
- Installing setuptools............................done.
- Installing pip...................done.
- $ flask/bin/pip install flask
- #!flask/bin/pythonfrom flask import Flaskapp = Flask(__name__)@app.route('/')def index():
- return "Hello, World!"if __name__ == '__main__':
- app.run(debug=True)
- $ chmod a+x app.py
- $ ./app.py
- * Running on http://127.0.0.1:5000/
- * Restarting with reloader
- #!flask/bin/pythonfrom flask import Flask, jsonifyapp = Flask(__name__)tasks = [
- {
- 'id': 1,
- 'title': u'Buy groceries',
- 'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
- 'done': False
- },
- {
- 'id': 2,
- 'title': u'Learn Python',
- 'description': u'Need to find a good Python tutorial on the web',
- 'done': False
- }]@app.route('/todo/api/v1.0/tasks', methods=['GET'])def get_tasks():
- return jsonify({'tasks': tasks})if __name__ == '__main__':
- app.run(debug=True)
- $ curl -i http://localhost:5000/todo/api/v1.0/tasks
- HTTP/1.0 200 OK
- Content-Type: application/json
- Content-Length: 294
- Server: Werkzeug/0.8.3 Python/2.7.3
- Date: Mon, 20 May 2013 04:53:53 GMT
- {
- "tasks": [
- {
- "description": "Milk, Cheese, Pizza, Fruit, Tylenol",
- "done": false,
- "id": 1,
- "title": "Buy groceries"
- },
- {
- "description": "Need to find a good Python tutorial on the web",
- "done": false,
- "id": 2,
- "title": "Learn Python"
- }
- ]
- }
- from flask import [email protected]('/todo/api/v1.0/tasks/<int:task_id>', methods=['GET'])def get_task(task_id):
- task = filter(lambda t: t['id'] == task_id, tasks)
- if len(task) == 0:
- abort(404)
- return jsonify({'task': task[0]})
- $ curl -i http://localhost:5000/todo/api/v1.0/tasks/2
- HTTP/1.0 200 OK
- Content-Type: application/json
- Content-Length: 151
- Server: Werkzeug/0.8.3 Python/2.7.3
- Date: Mon, 20 May 2013 05:21:50 GMT
- {
- "task": {
- "description": "Need to find a good Python tutorial on the web",
- "done": false,
- "id": 2,
- "title": "Learn Python"
- }
- }
- $ curl -i http://localhost:5000/todo/api/v1.0/tasks/3
- HTTP/1.0 404 NOT FOUND
- Content-Type: text/html
- Content-Length: 238
- Server: Werkzeug/0.8.3 Python/2.7.3
- Date: Mon, 20 May 2013 05:21:52 GMT
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
- <title>404 Not Found</title>
- <h1>Not Found</h1>
- <p>The requested URL was not found on the server.</p><p>If you entered the URL manually please check your spelling and try again.</p>
- from flask import [email protected](404)def not_found(error):
- return make_response(jsonify({'error': 'Not found'}), 404)
- $ curl -i http://localhost:5000/todo/api/v1.0/tasks/3
- HTTP/1.0 404 NOT FOUND
- Content-Type: application/json
- Content-Length: 26
- Server: Werkzeug/0.8.3 Python/2.7.3
- Date: Mon, 20 May 2013 05:36:54 GMT
- {
- "error": "Not found"
- }
- from flask import [email protected]('/todo/api/v1.0/tasks', methods=['POST'])def create_task():
- if not request.json or not 'title' in request.json:
- abort(400)
- task = {
- 'id': tasks[-1]['id'] + 1,
- 'title': request.json['title'],
- 'description': request.json.get('description', ""),
- 'done': False
- }
- tasks.append(task)
- return jsonify({'task': task}), 201
- $ curl -i -H "Content-Type: application/json" -X POST -d '{"title":"Read a book"}' http://localhost:5000/todo/api/v1.0/tasks
- HTTP/1.0 201 Created
- Content-Type: application/json
- Content-Length: 104
- Server: Werkzeug/0.8.3 Python/2.7.3
- Date: Mon, 20 May 2013 05:56:21 GMT
- {
- "task": {
- "description": "",
- "done": false,
- "id": 3,
- "title": "Read a book"
- }
- }
- curl -i -H "Content-Type: application/json" -X POST -d "{"""title""":"""Read a book"""}" http://localhost:5000/todo/api/v1.0/tasks
- $ curl -i http://localhost:5000/todo/api/v1.0/tasks
- HTTP/1.0 200 OK
- Content-Type: application/json
- Content-Length: 423
- Server: Werkzeug/0.8.3 Python/2.7.3
- Date: Mon, 20 May 2013 05:57:44 GMT
- {
- "tasks": [
- {
- "description": "Milk, Cheese, Pizza, Fruit, Tylenol",
- "done": false,
- "id": 1,
- "title": "Buy groceries"
- },
- {
- "description": "Need to find a good Python tutorial on the web",
- "done": false,
- "id": 2,
- "title": "Learn Python"
- },
- {
- "description": "",
- "done": false,
- "id": 3,
- "title": "Read a book"
- }
- ]
- }
- @app.route('/todo/api/v1.0/tasks/<int:task_id>', methods=['PUT'])def update_task(task_id):
- task = filter(lambda t: t['id'] == task_id, tasks)
- if len(task) == 0:
- abort(404)
- if not request.json:
- abort(400)
- if 'title' in request.json and type(request.json['title']) != unicode:
- abort(400)
- if 'description' in request.json and type(request.json['description']) is not unicode:
- abort(400)
什麼是一個 RESTful 的 web service?
REST 架構的最初目的是適應萬維網的 HTTP 協議。
RESTful web services 概念的核心就是「資源」。 資源可以用URI來表示。客戶端使用 HTTP 協議定義的方法來發送請求到這些 URIs,當然可能會導致這些被訪問的」資源「狀態的改變。
HTTP 標準的方法有如下:
REST 設計不需要特定的數據格式。在請求中數據可以以JSON形式, 或者有時候作為 url 中查詢參數項。
設計一個簡單的 web service
堅持 REST 的准則設計一個 web service 或者 API 的任務就變成一個標識資源被展示出來以及它們是怎樣受不同的請求方法影響的練習。
比如說,我們要編寫一個待辦事項應用程序而且我們想要為它設計一個 web service。要做的第一件事情就是決定用什麼樣的根 URL 來訪問該服務。例如,我們可以通過這個來訪問:
http://[hostname]/todo/api/v1.0/
在這里我已經決定在 URL 中包含應用的名稱以及 API 的版本號。在 URL 中包含應用名稱有助於提供一個命名空間以便區分同一系統上的其它服務。在 URL 中包含版本號能夠幫助以後的更新,如果新版本中存在新的和潛在不兼容的功能,可以不影響依賴於較舊的功能的應用程序。
下一步驟就是選擇將由該服務暴露(展示)的資源。這是一個十分簡單地應用,我們只有任務,因此在我們待辦事項中唯一的資源就是任務。
我們的任務資源將要使用 HTTP 方法如下:
我們定義的任務有如下一些屬性:
目前為止關於我們的 web service 的設計基本完成。剩下的事情就是實現它!
Flask 框架的簡介
如果你讀過Flask Mega-Tutorial 系列,就會知道 Flask 是一個簡單卻十分強大的 Python web 框架。
在我們深入研究 web services 的細節之前,讓我們回顧一下一個普通的 Flask Web 應用程序的結構。
我會首先假設你知道 Python 在你的平台上工作的基本知識。 我將講解的例子是工作在一個類 Unix 操作系統。簡而言之,這意味著它們能工作在 Linux,Mac OS X 和 Windows(如果你使用Cygwin)。 如果你使用 Windows 上原生的 Python 版本的話,命令會有所不同。
讓我們開始在一個虛擬環境上安裝 Flask。如果你的系統上沒有 virtualenv,你可以從https://pypi.python.org/pypi/virtualenv上下載:
既然已經安裝了 Flask,現在開始創建一個簡單地網頁應用,我們把它放在一個叫 app.py 的文件中:
為了運行這個程序我們必須執行 app.py:
現在你可以啟動你的網頁瀏覽器,輸入http://localhost:5000看看這個小應用程序的效果。
簡單吧?現在我們將這個應用程序轉換成我們的 RESTful service!
使用 Python 和 Flask 實現 RESTful services
使用 Flask 構建 web services 是十分簡單地,比我在Mega-Tutorial中構建的完整的服務端的應用程序要簡單地多。
在 Flask 中有許多擴展來幫助我們構建 RESTful services,但是在我看來這個任務十分簡單,沒有必要使用 Flask 擴展。
我們 web service 的客戶端需要添加、刪除以及修改任務的服務,因此顯然我們需要一種方式來存儲任務。最直接的方式就是建立一個小型的資料庫,但是資料庫並不是本文的主體。學習在 Flask 中使用合適的資料庫,我強烈建議閱讀Mega-Tutorial。
這里我們直接把任務列表存儲在內存中,因此這些任務列表只會在 web 伺服器運行中工作,在結束的時候就失效。 這種方式只是適用我們自己開發的 web 伺服器,不適用於生產環境的 web 伺服器, 這種情況一個合適的資料庫的搭建是必須的。
我們現在來實現 web service 的第一個入口:
正如你所見,沒有多大的變化。我們創建一個任務的內存資料庫,這里無非就是一個字典和數組。數組中的每一個元素都具有上述定義的任務的屬性。
取代了首頁,我們現在擁有一個 get_tasks 的函數,訪問的 URI 為 /todo/api/v1.0/tasks,並且只允許 GET 的 HTTP 方法。
這個函數的響應不是文本,我們使用 JSON 數據格式來響應,Flask 的 jsonify 函數從我們的數據結構中生成。
使用網頁瀏覽器來測試我們的 web service 不是一個最好的注意,因為網頁瀏覽器上不能輕易地模擬所有的 HTTP 請求的方法。相反,我們會使用 curl。如果你還沒有安裝 curl 的話,請立即安裝它。
通過執行 app.py,啟動 web service。接著打開一個新的控制台窗口,運行以下命令:
我們已經成功地調用我們的 RESTful service 的一個函數!
現在我們開始編寫 GET 方法請求我們的任務資源的第二個版本。這是一個用來返回單獨一個任務的函數:
第二個函數有些意思。這里我們得到了 URL 中任務的 id,接著 Flask 把它轉換成 函數中的 task_id 的參數。
我們用這個參數來搜索我們的任務數組。如果我們的資料庫中不存在搜索的 id,我們將會返回一個類似 404 的錯誤,根據 HTTP 規范的意思是 「資源未找到」。
如果我們找到相應的任務,那麼我們只需將它用 jsonify 打包成 JSON 格式並將其發送作為響應,就像我們以前那樣處理整個任務集合。
調用 curl 請求的結果如下:
當我們請求 id #2 的資源時候,我們獲取到了,但是當我們請求 #3 的時候返回了 404 錯誤。有關錯誤奇怪的是返回的是 HTML 信息而不是 JSON,這是因為 Flask 按照默認方式生成 404 響應。由於這是一個 Web service 客戶端希望我們總是以 JSON 格式回應,所以我們需要改善我們的 404 錯誤處理程序:
我們會得到一個友好的錯誤提示:
接下來就是 POST 方法,我們用來在我們的任務資料庫中插入一個新的任務:
添加一個新的任務也是相當容易地。只有當請求以 JSON 格式形式,request.json 才會有請求的數據。如果沒有數據,或者存在數據但是缺少 title 項,我們將會返回 400,這是表示請求無效。
接著我們會創建一個新的任務字典,使用最後一個任務的 id + 1 作為該任務的 id。我們允許 description 欄位缺失,並且假設 done 欄位設置成 False。
我們把新的任務添加到我們的任務數組中,並且把新添加的任務和狀態 201 響應給客戶端。
使用如下的 curl 命令來測試這個新的函數:
注意:如果你在 Windows 上並且運行 Cygwin 版本的 curl,上面的命令不會有任何問題。然而,如果你使用原生的 curl,命令會有些不同:
當然在完成這個請求後,我們可以得到任務的更新列表:
剩下的兩個函數如下所示:
『柒』 如何將C++的API封裝成python可調用形式
在C++的庫上面套一層wrapper就可以了。
可以包裝成CPython模塊,也可以包裝成C庫然後用ctypes、cffi調用。
要對付主要是是C++的函數命名和類型。
包裝CPython模塊可以看手冊里「Extending and Embedding」的部分。只要保證initMODULENAME(2.x)或PyInit_MODULENAME(3.x)是extern "C"的就行,手冊里的例子用了PyMODINIT_FUNC這個宏,已經自動給加好了。
包裝C庫就是把所有函數都聲明成extern "C"的,把傳遞的C++類型以C類型替代。舉個例子
namespace enemy {
void first_blood(int id);
} // namespace enemy
void double_kill();
void double_kill(int killer);
class Silencer
{
public:
std::string watch_and_learn();
};
包裝之後大概是這樣的:
extern "C" {
void enemy_first_blood(int id)
{
enemy::first_blood(id);
}
void double_kill_by_roshan()
{
double_kill();
}
void double_kill_by_hero(int killer)
{
double_kill(killer);
}
void* new_silencer()
{
return new Sliencer;
}
void silencer_watch_and_learn(void *instacne, char *buffer)
{
std::string what = reinterpret_cast<Silencer*>(instance)->watch_and_learn();
strcpy(buffer, what.c_str());
}
void release_silencer(void *instacne)
{
delete reinterpret_cast<Silencer*>(instance);
}
} // extern "C"
『捌』 如何用python 快速做出一個api服務
python 輕量級的框架flask
可以讓你在兩分鍾內,搭建出一個簡單的
api介面服務
輕量級不代表功能簡單,容易上手
它的優勢是,模塊化,易擴展,定製性強
比如:一個最簡單api介面2 分鍾搞定
加入你需要加入登錄驗證功能
加入頁面跳轉功能呢
如果想要渲染載入前段頁面呢
flask框里有你意想不到的插件,讓你完成最夠強大
的功能,怎麼樣,趕緊來試試吧
『玖』 python 怎麼提供api介面
python有個etcd的庫,可以網上搜下看下這個庫的使用以及它開發的api介面,
不過之前go使用etcd的時候,是調用etcd本身的rest
api,沒有使用第三方的etcd的庫
etcd的api文檔github上有的,搜下這個coreos/etcd
你可以選擇自己喜歡的方式
『拾』 python怎麼調用api介面
調用windows API的方式其實有兩種,第一種是通過第三方模塊pywin32。
如果小夥伴安裝了pip,可以通過pip安裝pywin32
在命令行中運行pip pst查看是否安裝了pywin32
如圖
我們這里調用一個windows最基本的API,MessageBox,該介面可以顯示一個對話框。
這里小編就不過多介紹了,只簡單的描述MessageBox介面,MessageBox是windows的一個API介面,作用是顯示一個對話框。
原型為:
int WINAPI MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType);
第一個參數hWnd,指明了該對話框屬於哪個窗口,lpText為窗口提示信息,lpCaption則為窗口標題,uType則是定義對話框的按鈕和圖標。
這里我們需要導入win32api這個模塊(隸屬於pywin32),如果需要宏定義的,API的宏被定義在win32con(同隸屬於pywin32)模塊內。
這里我們只導入一個win32api模塊,然後簡單的調用MessageBox顯示一個對話框即可。
如果我們不會安裝pywin32模塊,或者說不想安裝這個三方模塊。這時我們還有一個辦法。
調用python內置模塊ctypes,如果小夥伴有windows編程基礎的話,或者看過一點MSDN的話,都該知道,Windows的API其實是以dll文件(動態鏈接庫)方式存在的。
+和|效果是相同的
更多Python相關技術文章,請訪問Python教程欄目進行學習!以上就是小編分享的關於python怎麼調用api介面的詳細內容希望對大家有所幫助,更多有關python教程請關注環球青藤其它相關文章!