1. php的curl模塊和python的pycurl模塊的區別
php的curl,是在php發布程序的ext文件中,作為一個php自帶的支持,需要改寫php的配置文件,修改php.ini,將;extension=php_curl.dll前的分號去掉。
python的pycurl,不是python自帶的支持程序,python在做爬蟲一般都是用urllib,urllib2,twisted等,比較少的使用pycurl.安裝略.
c的curl,是前面2個語言的curl父程序,是c的curl才有了php的curl和python的pycurl,同時,python的pycurl
文檔說明了只實現了部分功能,即是一個c的curl的閹割版。淚奔,原來用了那麼長時間的東西,連冰山一角都沒觸碰,或者python的pycurl也只
是會用其中的一個或少數幾個功能。
2. python 有沒有php裡面的soapclient這樣的東西
SOAP.py 客戶機和伺服器
SOAP.py 包含的是一些基本的東西。沒有 Web 服務描述語言(Web Services Description Language,WSDL)或者任何其它附加的東西,只有用 Python 實現的 SOAP 客戶機和伺服器的透明支持。甚至這個包中的一個很好的功能也只是與基礎架構相關:SOAP.py 支持安全套接字層(SSL)用於加密的 SOAP 傳輸。為使用這個功能,您必須安裝 M2Crypto,M2Crypto 是一個庫,包含各種加密工具和格式,從 RSA 和 DSA 到 HTTPs、S/MIME 等等。在這一部分,我們不準備討論 SOAP.py 的 SSL 支持。
SOAP 操作摘要
目前為止,SOAP 實用程序好象仍是比較流行的使用 Python 的開放源代碼活動。下面是該項目的綱要以及它們目前的狀態。首先,參與者:
4Suite SOAP,由 Fourthought 管理
SOAPy,由 Adam Elman 管理
SOAP.py,Python 項目的一個 Web 服務項目
soaplib,由 Secret Labs 管理
Orchard,由 Ken MacLeod 管理
PySOAP,由 Dave Warner 管理
4Suite SOAP 是我們自己的實現,我們在本專欄的前面三部分中使用過(請參閱 參考資料以獲得它的鏈接)。它目前仍在開發中。
SOAPy 是在 2001 年 4 月公布的,目前處於 alpha 的預備階段,但現在好象停止開發了。
SOAP.py 開發被凍結了。SOAP.py 這個項目是由 actzero 公司贊助的,而 actzero 卻不再從事這一行業了。正在邀請自願開發/維護 SOAP.py 的組織。
soaplib 的開發好象也延緩了,考慮到 Secret Labs 這段時間所承擔的大量工作,或許就可以理解為什麼會這樣了。這個瑞典的公司是由 Fredrik Lundh 掌管的,他在 Python 圈內是出名的「工作狂」,同時也是 Python Association 董事會的一名成員。Secret Labs 還開發 PythonWare(Python 的一個核心和重要的附加模塊);PythonWorks(一個領先的 Python IDE);Python Imaging Library 和許多其它好東西(日常 Python-URL Web 日誌就是其中的一部分)。
Orchard 是一個數據管理框架,基本上是一種用一個公共介面管理不同數據格式的方法。它實現了一個 SOAP 客戶機作為在遠程過程調用中向 SOAP 伺服器發送 Orchard 數據項的基本方法(被稱為節點)。
PySOAP 這個項目主要是想作為 Dave Warner 的 Church 管理套件的一部分,但它還從沒發行過任何文件,好象是一個毫無生氣的項目。
安裝
開始先下載分發包(在寫這篇文章的時候,SOAPpy 0.9.7 是最新的分發包),把文件解包,轉到結果目錄,並把文件 SOAP.py復制到自己傾向的位置。當然,這個「傾向」就是需要技巧的地方。由於這些 SOAP lib 中有很多都使用大小寫組合不同的「soap.py」作為模塊名,所以大家一定要小心。當然,UNIX 用戶只需關心大小寫是否精確匹配,但對於 Windows 用戶來說,甚至「SOAP.py」和「soap.py」之間的沖突也會帶來麻煩。Orchard 的 SOAP.py 也有一個容易發生沖突的名稱,但它有可能避開所有的問題,因為它的模塊聰明地放在了 Orchard 包中。
上面的內容簡言之就是建議您確保安裝所有的 Python SOAP 模塊時都使用與眾不同的包名稱。在我們的案例中,我們在 PYTHONPATH 中發現了一個合適的目錄並創建了一個 WebServices 包,把 SOAP.py 放在了這個包中。因此,在 Linux 中:
$ mkdir ~/lib/python/WebServices
$ touch ~/lib/python/WebServices/__init__.py
$ cp SOAPpy097/SOAP.py ~/lib/python/WebServices
請注意很重要的第二條命令,它將生成一個 __init__.py 文件,這個文件將 WebServices 目錄標志為 Python 包。如果您需要把這些代碼打包成 Windows 版本,您可能希望向空文件中輸入一些注釋,因為一些 Windows 工具不創建空文件。
您已深入主題了
對於公開提供的 SOAP 伺服器,早已經有了好幾個活動的注冊中心。最流行的可能是 XMethods。當然,它也是一個相當有趣的指導,通過它我們可以了解 SOAP 的實際狀況,而不要聽它的吹噓。這里的大多數公共 Web 服務仍然只是一些無關緊要的東西,幾乎不值得我們勇敢的新模型多費口舌,但那是另一回事了。實際上,我們將選擇一個公共服務來演示和測試如何把 SOAP.py 作為 SOAP 客戶機使用。
或者,我們可以試試。作者嘗試的第一個服務,衛生保健提供者定位器,在遇到下列報錯消息時顯示 SOAP 互操作性的當前狀態中的陷阱:
WebServices.SOAP.faultType: <Fault soap:Client:
Server did not recognize the value of
HTTP Header SOAPAction: "".>
哦。SOAPAction 是一個 HTTP 頭,應該是用來標記被訪問服務的。它是 SOAP 請求中必需的頭,但即便是設置了所需的頭(只是一對空的雙引號)後,上面的錯誤仍然存在。作者發現大多數 MS SOAP 實現都存在這個問題。在試遍了這些服務後,我們斷定,Delphi 實現好象與 SOAP.py 合作得最好,但在試服務時 — 即使是用 Delphi 實現時,也返回復雜的類型,比如列表,SOAP.py 無法使用它們,返回不帶數據的 WebServices.SOAP.typedArrayType 實例。
最後,作者選擇了一個相當合適的 Web 服務,該服務返回漫畫《丁丁歷險記》中的人物 Haddock 船長常用的罵人語言(是的,大多數 Web 服務都是這樣)。 清單 1(curse.py)就是這個程序。
清單 1:訪問 Curse 生成器 SOAP 服務的 SOAP.py 程序
#!/usr/bin/env python
import sys
#Import the SOAP.py machinery
from WebServices import SOAP
remote = SOAP.SOAPProxy(
"ck.exe/soap/IHaddock",
namespace="urn:HaddockIntf-IHaddock",
soapaction="urn:HaddockIntf-IHaddock#Curse"
)
try:
lang = sys.argv[1]
except IndexError:
lang = "us"
result = remote.Curse(LangCode=lang)
print "What captain Haddock had to say: "%s""%result
把一切綜合在一起
導入庫後,我們將設置代理對象 remote 。這個對象將方法調用轉換為遠程 SOAP 消息。它的初始化器使用管理遠程請求的關鍵參數: 伺服器的 URI(被稱為「端點」)、請求元素的 XML 名稱空間(通過它,SOAP-as-RPC 將 口頭承諾變成 XML 基礎)和 SOAPAction 頭值。
接下來,我們將確定方法參數,對於這個 Web 服務來說,方法參數只是 Haddock 罵人的語言,瑞典語(「se」)或英語(奇怪的是,是「us」而不是「en」)。
最後,我們調用名稱正確的方法,代理對象的 Curse 進行 SOAP 調用,然後列印出結果。下面的會話演示了對該程序的使用:
$ python curse.py
What captain Haddock had to say: "Ectoplasmic Byproct!"
我們自己的 SOAP 伺服器
用 SOAP.py 實現 SOAP 伺服器相當容易。作為一個示例,我們將仿建欄位,還要實現一個很常見的服務:一個程序,給出年份和月份,它將以字元串的形式列印出日歷。它的程序伺服器是 清單 2(calendar-ws.py)。
清單 2:實現日歷伺服器的 SOAP.py 程序
#!/usr/bin/env python
import sys, calendar
#Import the SOAP.py machinery
from WebServices import SOAP
CAL_NS = "/simple-cal"
class Calendar:
def getMonth(self, year, month):
return calendar.month(year, month)
def getYear(self, year):
return calendar.calendar(year)
server = SOAP.SOAPServer(("localhost", 8888))
cal = Calendar()
server.registerObject(cal, CAL_NS)
print "Starting server..."
server.serve_forever()
進行過必要的導入後,我們為自己的伺服器定義 SOAP 請求元素期望的名稱空間( CAL_NS )。接下來我們定義實現所有方法的類,這些方法將被公開為 SOAP 方法。大家也可以把單個函數作為 SOAP 方法注冊,但使用類方法是最靈活的,特別是當您想管理調用間的狀態時。這個 Calendar 類定義了一個方法 getMonth ,該方法使用 Python 的內置日歷模塊在文本表單中返回月度日歷,同時它還定義了另一個返回整年日歷的方法。
然後創建 SOAP 伺服器框架的一個實例,這個實例還帶有偵聽埠 8888 的指令。我們還必須創建 Calendar 類的一個實例,這個實例在下一行中被注冊用來處理 SOAP 消息,同時為其指出相關的名稱空間。最後,我們調用 serve_forever 方法,該方法直到進程終止才返回。
為運行伺服器,請打開另一個命令 shell 並執行 python calendar-ws.py 。執行結束時使用 ctrl-C 殺死進程。
我們本來可以用也是用 SOAP.py 寫的客戶機測試伺服器,但那太顯而易見了。我們還是用低級 Python 編寫客戶機把 SOAP 響應作為 XML 字元串來構建,並發送一條 HTTP 消息。這個程序(testcal.py)在 清單 3中。
清單 3:用 Python 核心庫寫的訪問日歷服務的客戶機
import sys, httplib
SERVER_ADDR = "127.0.0.1"
SERVER_PORT = 8888
CAL_NS = "ple-cal"
BODY_TEMPLATE = """<SOAP-ENV:Envelope
xmlns:SOAP-ENV="oap/envelope/"
xmlns:s="/ws/simple-cal"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/1999/XMLSchema"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
>
<SOAP-ENV:Body>
<s:getMonth>
<year xsi:type="xsd:integer">%s</year>
<month xsi:type="xsd:integer">%s</month>
</s:getMonth>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>"""
def GetMonth():
year = 2001
month = 12
body = BODY_TEMPLATE%(year, month)
blen = len(body)
requestor = httplib.HTTP(SERVER_ADDR, SERVER_PORT)
requestor.putrequest("POST", "cal-server")
requestor.putheader("Host", SERVER_ADDR)
requestor.putheader("Content-Type", "text/plain; charset="utf-8"")
requestor.putheader("Content reply_body = requestor.getfi-Length", str(blen))
requestor.putheader("SOAPAction", "het/eg/ws/simple-car")
requestor.endheaders()
requestor.send(body)
(status_code, message, reply_headers) = requestor.getreply()
le().read()
print "status code:", status_code
print "status message:", message
print "HTTP reply body:\n", reply_body
if __name__ == "__main__":
GetMonth()
下面的會話演示了這個測試的運行情況。
$ python testcal.py
status code: 200
status message: OK
HTTP reply body:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="http://www.w3.org/1999/XMLSchema" xmlns:SOAP-
ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:SO
AP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<getMonthResponse SOAP-ENC:root="1">
<Result xsi:type="xsd:string"> December 2001
Mo Tu We Th Fr Sa Su
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
</Result>
</getMonthResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
仔細審查的位元組
如果您查找行 self.debug = 0 並把「0」改為「1」(這是 SOAP.py 版本 0.9.7 中的第 210 行),有一件要注意的事情是您可以獲得被交換的實際 SOAP 消息的詳細信息和用於調試與跟蹤的其它關鍵數據,這對您很有用。作為示例,下面提供了一個會話,它是打開了調試信息顯示開關的以前的 curses.py 程序的一個會話:
$ python curse.py
*** Outgoing HTTP headers **********************************************
POST /scripts/Haddock.exe/soap/IHaddock HTTP/1.0
Host: www.tankebolaget.se
User-agent: SOAP.py 0.9.7 (actzero.com)
Content-type: text/xml; charset="UTF-8"
Content-length: 523
SOAPAction: "urn:HaddockIntf-IHaddock#Curse"
************************************************************************
*** Outgoing SOAP ******************************************************
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="http://www.w3.org/1999/XMLSchema" xmlns:SOAP-
ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:SO
AP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:Curse xmlns:ns1="urn:HaddockIntf-IHaddock" SOAP-ENC:root="1">
<LangCode xsi:type="xsd:string">us</LangCode>
</ns1:Curse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
************************************************************************
*** Incoming HTTP headers **********************************************
HTTP/1.? 200 OK
Server: Microsoft-IIS/5.0
Date: Tue, 11 Sep 2001 16:40:19 GMT
Content-Type: text/xml
Content-Length: 528
Content:
************************************************************************
*** Incoming SOAP ******************************************************
<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-
ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/1999/XMLSchema"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xml
soap.org/soap/encoding/"><SOAP-ENV:Body><NS1:CurseResponse xmlns:NS1="urn:HaddockIntf-
IHaddock" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><NS1:return
xsi:type="xsd:string">Anacoluthons!</NS1:return></NS1:CurseRespon
se></SOAP-ENV:Body></SOAP-ENV:Envelope>
************************************************************************
What captain Haddock had to say: "Anacoluthons!"
為進行比較,您可以在帶有下列代碼的舊的 Python 腳本或程序中獲得相同的信息:
import calendar
return calendar.month(2001, 10)
SOAP.py 總結
我們已經注意到了,雖然 SOAP.py 的互操作性還存在一些問題,但可用的調試工具可望提供幫助。
3. 詳解Python中import方法引入模塊
在python用import或者from...import或者from...import...as...來導入相應的模塊,作用和使用方法與C語言的include頭文件類似。其實就是引入某些成熟的函數庫和成熟的方法,避免重復造輪子,提高開發速度。
python的import方法可以引入系統的模塊,也可以引入我們自己寫好的共用模塊,這點和php非常相似,但是它們的具體細節還不是很一樣。因為php是在引入的時候指明引入文件的具體路徑,而python中不能夠寫文件路徑進行引入。
下面總結一下import的幾種情況:
python包含子目錄中的模塊方法比較簡單,關鍵是能夠在sys.path裡面找到通向模塊文件的路徑。
下面將具體介紹幾種常用情況:
(1)主程序與模塊程序在同一目錄下:
如下面程序結構:
`-- src
|-- mod1.py
`-- test1.py
若在程序test1.py中導入模塊mod1, 則直接使用import mod1或from mod1 import *;
(2)主程序所在目錄是模塊所在目錄的父(或祖輩)目錄
如下面程序結構:
`-- src
|-- mod1.py
|-- mod2
| `-- mod2.py
`-- test1.py
若在程序test1.py中導入模塊mod2, 需要在mod2文件夾中建立空文件__init__.py文件(也可以在該文件中自定義輸出模塊介面); 然後使用 from mod2.mod2 import * 或import mod2.mod2.
(3)主程序導入上層目錄中模塊或其他目錄(平級)下的模塊
如下面程序結構:
`-- src
|-- mod1.py
|-- mod2
| `-- mod2.py
|-- sub
| `-- test2.py
`-- test1.py
若在程序test2.py中導入模塊mod1和mod2。首先需要在mod2下建立__init__.py文件(同(2)),src下不必建立該文件。然後調用方式如下:
下面程序執行方式均在程序文件所在目錄下執行,如test2.py是在cd sub;之後執行python test2.py
而test1.py是在cd src;之後執行python test1.py; 不保證在src目錄下執行python sub/test2.py成功。
import sys
sys.path.append("..")
import mod1
import mod2.mod2
4. php調用python,無法使用numpy等模塊
一般伺服器不可能給php執行shell腳步許可權的,危險性太大。
再比如,如果以後Python與PHP不在一台伺服器上怎麼辦?
所以,可以考慮通過api介面傳遞參數。
5. 如何在PHP伺服器里運行python腳本
python環境在小鳥雲雲伺服器裝好後,就有一個idle工具,你找一下安裝目錄,自帶的編輯器,在任意目錄新建一個
aa.py
文件,用記事本和idle工具都行,輸入print("hello
world"),如果你使用的是idle,直接按f5,就能查看結果,如果用記事本,打開cmd,進入這個目錄,輸入命令python
aa.py就出來結果了。
6. 有沒有辦法將PHP作為類似Python或Ruby一樣的獨立腳本來使用
可以,PHP運行方式有很多種,利用Apache,Nginx,IIS等web容器,只是其中一種使用的方式。
直接當做腳本的話,可以通過CLI的方式直接執行
7. php調用python
py和php放在同一個目錄下面
some.py
------------------------------------------
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import sys
def do_some(a):
return "dosome:%s" % a
if __name__ == '__main__':
a = sys.argv[1]
if a:
T = do_some(a)
print T
-------------------------------------------
t.php
<?php
$k = $_REQUEST['k'];
if (!empty($k))
{
$k = trim($k);
// $a = array();
// exec('python ./some.py '.$k, $a);
// echo $a[0];
passthru('python ./some.py '.$k);
}
然後瀏覽器裡面輸入
瀏覽器會返回dosome:test
被我注釋掉的代碼也可以用來替代passthru
裡面的$a 用來捕獲輸出 不過束腰注意的是 這里的arry 他是按照每一行'
'當作一個元素
但是passthru 則是你python里的print的原樣輸出
8. python怎麼獲取需要登陸的介面的數據
使用Python做爬蟲是很廣泛的應用場景,那就涉及到了Python是如何獲取介面數據的呢?Python擁有很多很強大的類庫,使用urllib即可輕松獲取介面返回的數據。
...展開
工具原料Python開發工具url介面,用於請求獲取數據
方法/步驟分步閱讀
1
/4
首先新建一個py文件,導入所需的類庫,urllib,json等。
2
/4
聲明api的url地址,和構造請求頭。
3
/4
使用urlopen方法發起請求並獲取返回的數據。
4
/4
最後就是對返回字元串的處理了。比如字元串的截取,字元串的轉換成json對象,轉換成欄位,再獲取對應key的值。
使用Python3實現HTTP get方法。使用聚合數據的應用編程介面,你可以調用小發貓AI寫作API。這是一個免費的應用程序介面,先上代碼,詳細說明寫在後面:
1
2
3
4
5
6
7
8
9
10
11
12
import requests
import time
import re
se = requests.session()
if __name__ == '__main__':
Post_url = "http://api-ok.xiaofamao.com/api.php?json=0&v=1&key=xxxxxx" #自己想辦法弄到key
Post_data = {
'wenzhang': '床前明月光,疑是地上霜。'
}
Text = se.post(Post_url, data=Post_data).text.replace("'", '"').replace('/ ', '/')
print(Text)
首先,什麼是原料葯?應用編程介面的全稱也稱為應用編程介面。它簡稱為應用編程介面。當我第一次接觸介面調用時,我不知道寫什麼,因為我看了整個項目。這個項目是由龍卷風寫的。看了半天龍卷風後,我發現我走錯了方向。我只是直接看著界面,因為沒有人告訴我項目的整個過程。我不得不強迫自己去看它。我所要做的就是找到程序的主入口,然後根據函數一步一步地調用它。
當我編寫介面時,因為我必須配合後台編寫和瀏覽器訪問,每次訪問只需要傳入相應的參數來調用相應的介面。界面可以由他人編寫,也可以由合作公司提供。當然,合作公司提供的不是免費的。現在基本上,如果我不訪問它一次,它只收費幾美分。當你聽到這些,不要低估這幾分。有時候如果你打了幾百萬次電話,會花很多錢。有些人認為,我們不能按月付款嗎?對不起,我不知道。總之,我們一個接一個地計算,因為第一次,我認為我買的那些直接買了我們想要的所有數據,把它們保存在本地資料庫中,當我使用它們時,直接從我自己的資料庫中轉移它們。後來,我發現我想得太多了,偽原創API。
該介面調用由python的請求庫訪問,它基本上是一個get或post請求。有些介面是加密的,然後我們必須用另一方提供給我們的公鑰加密或解密,然後用相應的參數訪問。我們想要的數據基本上是在請求後返回的結果中以json格式解析的。因此,在請求之後,我們可以用請求提供的json函數來解析它,然後提取數據以一次訪問一個數據。
沒錯,介面調用就是這么簡單,但是有了後台編寫,我才發現請求庫現在有多強大,只要它是http或https,我很高興我在一周內讀完了請求和bs4,我真的不打電話給爬蟲工程師,如果我是爬蟲的時候不學習請求,你能用scrapy寫4=dead來寫它嗎?Urllib的單詞基本上被刪除了。如果你有要求,為什麼要用這個?
9. PHP的curl模塊和python的pycurl模塊的區別
這兩個沒啥區別,都是php或者python對curl
c庫的介面封裝,底層調用的東西是一樣的,唯一說是不一樣的,估計也就是封裝出來的介面參數可能不一樣。
如果解決了您的問題請採納!
如果未解決請繼續追問
10. PHP開發人員的Python基礎知識
PHP(外文名:PHP: Hypertext Preprocessor,中文名:「超文本預處理器」)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛,主要適用於Web開發領域。那麼PHP開發人員的Python基礎知識都有哪些呢?以下僅供參考!
常用縮略語
Ajax:非同步 JavaScript + XML
XML:可擴展標記語言(Extensible Markup Language)
什麼是 Python?
Python 的定義是一種 「通用的高級編程語言」。它以簡潔性和易用性著稱,而且是少有的幾種對空格和縮進有要求的語言之一。Python 的主要作者 Guido Van Rossum 在社區中仍然非常活躍,並且被人們戲稱為仁慈的領導。
Python 的靈活性和緊湊性是值得稱贊的。它支持面向對象編程、結構化編程、面向方面編程以及函數編程等。Python 採用小內核設計,但具備大量擴展庫,從而確保了該語言的緊湊性和靈活性。
從語法的角度來說,您會發現 Python 的簡潔性異常突出——幾乎可以說是一種純粹的境界。PHP 開發人員要麼會對這種方法的語法深深陶醉,要麼會發現它的局限性。這主要取決於您自己的見解。Python 社區推動這種美感的態度是非常明確的,它們更加重視的是美學和簡潔性,而不是靈動的技巧。已形成 Perl 傳統(「可以通過多種方式實現它」)的 PHP 開發人員(像我自己)將面對一種完全相反的哲學(「應該只有一種方法可以實現它」)。
事實上,該社區定義了一種特有的代碼風格術語,即 Python 化(pythonic)。您可以說您的代碼是 Python 化,這是對 Python 術語的良好運用,同時還可展現語言的自然特性。本文並不打算成為 Pythonista(或 Pythoneer),但如果您想繼續 Python 之路,那麼千萬不能錯過本文的知識點。就像 PHP 有自己的編程風格,Perl 有自己的概念方法,學習 Python 語言必然也需要開始用該語言來思考問題。
另一個要點:在撰寫本文時,Python 的最新版本是 V3.0,但本文主要側重於 Python V2.6。Python V3.0 並不能向後兼容之前的版本,而且 V2.6 是使用最為廣泛的版本。當然,您可以根據需求使用自己喜好的版本。
Python 與 PHP 有何不同?
一般來說,PHP 是一種 Web 開發語言。是的,它提供了一個命令行介面,並且甚至可用於開發嵌入式應用程序,但它主要還是用於 Web 開發。相反,Python 是一種腳本語言,並且也可用於 Web 開發。從這方面來說,我知道我會這樣說——它比 PHP 更加接近 Perl。(當然,在其他方面,它們之間並無實際不同。我們繼續往下看。)
PHP 的語法中充斥著美元符號($)和大括弧({}),而 Python 相對來說則更加簡潔和干凈。PHP 支持 switch 和 do...while 結構,而 Python 則不盡然。PHP 使用三元操作符(foo?bar:baz)和冗長的函數名列表,而命名約定更是無所不有;相反,您會發現 Python 要簡潔多了。PHP 的數組類型可同時支持簡單列表和字典或散列,但 Python 卻將這兩者分開。
Python 同時使用可變性和不變性的概念:舉例來說,tuple 就是一個不可變的列表。您可以創建 tuple,但在創建之後不能修改它。這一概念可能要花些時間來熟悉,但對於避免錯誤極為有效。當然,更改 tuple 的惟一方法是復制它。因此,如果您發現對不可變對象執行了大量更改,則應該重新考量自己的方法。
之前提到,Python 中的縮進是有含義的:您在剛開始學習該語言時會對此非常難以適應。您還可以創建使用關鍵字作為參數的函數和方法——這與 PHP 中的標准位置參數迥然不同。面向對象的追隨者會對 Python 中真正的面向對象思想感到欣喜,當然還包括它的 「一級」 類和函數。如果您使用非英語語言,則會鍾愛於 Python 強大的.國際化和 Unicode 支持。您還會喜歡 Python 的多線程功能;這也是最開始令我為之著迷的特性之一。
綜上所述,PHP 和 Python 在許多方面都彼此類似。您可以方便地創建變數、循環,使用條件和創建函數。您甚至可以輕松地創建可重用的模塊。兩種語言的用戶社區都充滿活力和激情。PHP 的用戶群體更加龐大,但這主要歸因於它在託管伺服器及 Web 專注性方面的優勢和普及性。
很好 簡要介紹到此為止。我們開始探索之旅。
使用 Python
清單 1 展示了一個基本的 Python 腳本。
清單 1. 一個簡單的 Python 腳本
for i in range(20):
print(i)
清單 2 展示了腳本的必然結果。
清單 2. 清單 1 的結果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
在深入探索之前,我們先來了解一些預備知識。首先從變數開始。
變數
可以看到,表示變數並不需要任何特殊的字元。變數 i 就是一個純粹的 i——毫無特殊之處。表示代碼塊或語言結束也不需要任何特殊字元(比如分號和括弧);只需要在 for 行使用一個簡單的冒號即可(:)。還需注意,縮進會向 Python 指示哪些內容屬於 for 循環。舉例來說,清單 3 中的代碼會在循環中為各編號輸出一個說明。
清單 3. 為各循環添加一條語句
for i in range(20):
print(i)
print('all done?')
相反,清單 4 中的代碼會在循環結束處輸出一條說明。
清單 4. 在循環後添加一條語句
for i in range(20):
print(i)
print('all done!')
現在,我第一次看到這樣的代碼時,我認為這完全是無稽之談。什麼?讓我相信換行和縮進能保證代碼的結構和運行?請相信我,不用多久,您就會習慣它(但我需要承認必須到達到分號處才會結束語句的運行)。如果您與其他開發人員共同開發 Python 項目,則會發現這種可讀性的用處是多麼大了。您不再像以前那樣總是猜測 「這個聰明的傢伙在這里究竟想幹些什麼?」
在 PHP,您使用 = 操作符為變數分配值(參見 清單 5)。在 Python 中,您使用相同的操作符,只是需要標記或指向值。對於我來說,它就是賦值操作而已,我不需要過多擔心專門的術語。
清單 5. 創建變數
yorkie = 'Marlowe' #meet our Yorkie Marlowe!
mutt = 'Kafka' #meet our mutt Kafka
print(mutt) #prints Kafka
Python 的變數名稱約定與 PHP 類似:您在創建變數名時只能使用字母、數字和下劃線(_)。同樣,變數名的第一個字元不能是數字。Python 變數名是區分大小寫的,並且您不能使用特定的 Python 關鍵字(比如 if、else、while、def、or、and、not、in 和 is 開始符)作為變數名。這沒有什麼值得奇怪的。
Python 允許您隨意執行基於字元串的操作。清單 6 中的大多數操作應該都是您熟悉的。
清單 6. 常見的基於字元串的操作
yorkie = 'Marlowe'
mutt = 'Kafka'
ylen = len(yorkie) #length of variable yorkie
print(ylen) #prints 7
print(len(yorkie)) #does the same thing
len(yorkie) #also does the same thing, print is implicit
print(yorkie.lower()) #lower cases the string
print(yorkie.strip('aeiou')) #removes vowels from end of string
print(mutt.split('f')) #splits "Kafka" into ['Ka', 'ka']
print(mutt.count('a')) #prints 2, the number of a's in string
yorkie.replace('a','4') #replace a's with 4's
條件語句
您已經了解了如何使用 for 循環;現在,我們來討論條件語句。您會發現 Phyon 中的條件語句與 PHP 基本相同:您可以使用熟悉的 if/else型結構,如清單 7 所示。
清單 7. 一個簡單的條件測試
yorkie = 'Marlowe'
mutt = 'Kafka'
if len(yorkie) > len(mutt):
print('The yorkie wins!')
else:
print('The mutt wins!')
您還可以使用 if/elif/else(elif,等價於 PHP 中的 elseif)創建更加復雜的條件測試,如清單 8 所示。
清單 8. 一個比較復雜的條件測試
yorkie = 'Marlowe'
mutt = 'Kafka'
if len(yorkie) + len(mutt) > 15:
print('The yorkie and the mutt win!')
elif len(yorkie) + len(mutt) > 10:
print('Too close to tell!')
else:
print('Nobody wins!')
您可能會說,目前為止並沒有什麼與眾不同的地方:甚本上和想像中沒有太大區別。現在,我們來看 Python 處理列表的方式,您會發現兩種語言之間的不同之處。
列表
一種常用的列表類型是 tuple,它是不可變的。在 tuple 中載入一系列值之後,您不會更改它。Tuple 可以包含數字、字元串、變數,甚至其他 tuples。Tuples 從 0 開始建立索引,這很正常;您可以使用 -1 索引訪問最後一個項目。您還可以對 tuple 運行一些函數(請參見清單 9)。
清單 9. Tuples
items = (1, mutt, 'Honda', (1,2,3))
print items[1] #prints Kafka
print items[-1] #prints (1,2,3)
items2 = items[0:2] #items2 now contains (1, 'Kafka') thanks to slice operation
'Honda' in items #returns TRUE
len(items) #returns 4
items.index('Kafka') #returns 1, because second item matches this index location
列表與 tuple 類似,只不過它們是可變的。創建列表之後,您可以添加、刪除和更新列表中的值。列表使用方括弧,而不是圓括弧(()),如清單 10 所示。
清單 10. 列表
groceries = ['ham','spam','eggs']
len(groceries) #returns 3
print groceries[1] #prints spam
for x in groceries:
print x.upper() #prints HAM SPAM EGGS
groceries[2] = 'bacon'
groceries #list is now ['ham','spam','bacon']
groceries.append('eggs')
groceries #list is now ['ham', 'spam', 'bacon', 'eggs']
groceries.sort()
groceries #list is now ['bacon', 'eggs', 'ham', 'spam']
字典類似於關聯數組或散列;它使用鍵值對來存儲和限制信息。但它不使用方括弧和圓括弧,而是使用尖括弧。與列表類似,字典是可變的,這意味著您可以添加、刪除和更新其中的值(請參見清單 11)。
清單 11. 字典
colorvalues = {'red' : 1, 'blue' : 2, 'green' : 3, 'yellow' : 4, 'orange' : 5}
colorvalues #prints {'blue': 2, 'orange': 5, 'green': 3, 'yellow': 4, 'red': 1}
colorvalues['blue'] #prints 2
colorvalues.keys() #retrieves all keys as a list:
#['blue', 'orange', 'green', 'yellow', 'red']
colorvalues.pop('blue') #prints 2 and removes the blue key/value pair
colorvalues #after pop, we have:
#{'orange': 5, 'green': 3, 'yellow': 4, 'red': 1}
在 Python 中創建一個簡單的腳本
現在,您已經對 Python 有了一定的了解。接下來,我們將創建一個簡單的 Python 腳本。該腳本將讀取位於您的伺服器 /tmp 目錄下的 PHP 會話文件的數量,並在日誌文件中寫入摘要報告。在該腳本中,您將學習如何導入特定函數的模塊,如何使用文件,以及如何寫入日誌文件。您還將設置一系列變數來跟蹤所收集的信息。
清單 12 展示了整個腳本。打開一個編輯器,並將代碼粘貼到其中,然後在系統中將該文件保存為 tmp.py。然後,對該文件運行 chmod + x,使它成為可執行文件(假定您使用 UNIX? 系統)。
清單 12. tmp.py
#!/usr/bin/python
import os
from time import strftime
stamp = strftime("%Y-%m-%d %H:%M:%S")
logfile = '/path/to/your/logfile.log'
path = '/path/to/tmp/directory/'
files = os.listdir(path)
bytes = 0
numfiles = 0
for f in files:
if f.startswith('sess_'):
info = os.stat(path + f)
numfiles += 1
bytes += info[6]
if numfiles > 1:
title = 'files'
else:
title = 'file'
string = stamp + " -- " + str(numfiles) + " session "
+ title +", " + str(bytes) + " bytes "
file = open(logfile,"a")
file.writelines(string)
file.close()
在第一行中,您可以看到一個 hash-bang 行:它用於標識 Python 解釋器的位置。在我的系統中,它位於 /usr/bin/python。請根據系統需求調整這一行。
接下來的兩行用於導入特定的模塊,這些模塊將幫助您執行作業。考慮到腳本需要處理文件夾和文件,因此您需要導入 os 模塊,因為其中包含各種函數和方法,可幫助您列出文件、讀取文件和操作文件夾。您還需要寫入一個日誌文件,因此可以為條目添加一個時間戳 — 這就需要使用時間函數。您不需要所有時間函數,只需要導入 strftime函數即可。
在接下來的六行中,您設置了一些變數。第一個變數是 stamp,其中包含一個日期字元串。然後,您使用 strftime 函數創建了一個特定格式的時間戳 — 在本例中,時間戳的格式為 2010-01-03 12:43:03。
接下來,創建一個 logfile 變數,並在文件中添加一個實際存儲日誌文件消息的路徑(該文件不需要實際存在)。為簡單起見,我在 /logs 文件夾中放置了一個日誌文件,但您也可以將它放置在別處。同樣,path 變數包含到 /tmp 目錄的路徑。您可以使用任何路徑,只要使用斜杠作為結束即可 (/)。
接下來的三個變數也非常簡單:files 列表包含指定路徑中的所有文件和文件夾,另外還包含 bytes 和 numfiles 兩個變數。這兩個變數都設置為 0;腳本會在處理文件時遞增這些值。
完成所有這些定義之後,接下來就是腳本的核心了:一個簡單的 for 循環,用於處理文件列表中的各文件。每次運行循環時,腳本都會計算文件名;如果它以 sess_ 開頭,則腳本會對該文件運行 os.stat(),提取文件數據(比如創建時間、修改時間和位元組大小),遞增 numfiles 計數器並將該文件的位元組大小累計到總數中。
當循環完成運行後,腳本會檢查 numfiles 變數中的值是否大於 1。如果大於 1,則會將一個新的 title 變數設置為 files;否則,title 將被設置為單數形式的 file。
腳本的最後部分也非常簡單:您創建了一個 string 變數,並在該變數中添加了一行以時間戳開始的數據,並且其後還包含 numfiles(已轉換為字元串)和位元組(也已轉換為字元串)。請注意繼續字元();該字元可允許代碼運行到下一行。它是一個提高可讀性的小技巧。
然後,您使用 open() 函數以附加模式打開日誌文件(畢竟始終需要在該文件中添加內容),writelines() 函數會將字元串添加到日誌文件中,而 close() 函數用於關閉該文件。
現在,您已經創建了一個簡單的 Python 腳本。該腳本可用於完成許多任務,舉例來說,您可以設置一個 cron作業來每小時運行一次這個腳本,以幫助您跟蹤 24 小時內所使用的 PHP 會話的數量。您還可以使用 jQuery 或其他一些 JavaScript 框架通過 Ajax 連接這個腳本,用於為您提供日誌文件提要(如果採用這種方式,則需要使用 print命令來返回數據)。