2013-11-23 138 views
3

我在OSX Mavericks上運行並安裝了python 3.3.3。python - 代碼在Linux上正常工作,但在OSX上崩潰

Python 3.3.3 (v3.3.3:c3896275c0f6, Nov 16 2013, 23:39:35) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin) 

我試圖運行這個(未完)代碼(一個簡單的HTTPS GET和POST與餅乾),但它有一個未知的錯誤崩潰:

import urllib.request as rqst 
import re 
import http.cookiejar 

def LoginICorsi(): 
     loginUrl = "https://www2.icorsi.ch/auth/shibboleth/" 
     rqst.install_opener(rqst.build_opener(rqst.HTTPCookieProcessor(http.cookiejar.CookieJar()))) 
     pageBytes = rqst.urlopen(loginUrl) 

     pageString = pageBytes.read().decode("utf-8") 

     action = re.findall(r'action="([^"]*)', pageString)[0] 

     loginPostUrl = "https://wayf.switch.ch" + action 
     loginPostUrl = loginPostUrl.replace("&", "&") 

     print("Posting USI to "+loginPostUrl) 
     postDATA = "user_idp=https://login2.usi.ch/idp/shibboleth".encode("utf-8") 
     usiLoginRequest = rqst.Request(loginPostUrl) 
     usiLoginRequest.add_header("Content-Type", "application/x-www-form-urlencoded") 
     usiLoginUrl = rqst.urlopen(usiLoginRequest, data=postDATA) 
     usiLoginResult = usiLoginUrl.read().decode("utf-8") 
     print(usiLoginResult) 

的問題是,這種代碼在Ubuntu上工作

Python 3.3.3 (default, Nov 20 2013, 00:22:18) 
[GCC 4.8.2] on linux 

所以我想代碼是正確的。

此外,當我使用Fiddler將HTTPS的系統代理設置爲代理時,代碼在我的Mac上工作。

這是追溯pastebin

我錯過了什麼?這是否與OSX,Python,HTTPS服務器或只是我的Mac? 與服務器握手時會出現問題,但我不明白它爲什麼適用於Linux。

+1

你是如何在Mac上安裝Python 3.3.3的?一個二進制安裝程序(如果是的話,來自python.org或其他)或源代碼構建(如果是,Homebrew,MacPorts或手動)?這看起來像是'ssl'模塊的一個問題,如果你使用圍繞OS X 10.8的OpenSSL而設計的配方,但是實際上擁有OS X 10.9的機器,這很容易得到。 – abarnert

+0

我下載了二進制安裝程序,http://www.python.org/ftp/python/3.3.3/python-3.3.3-macosx10.6.dmg –

回答

0

強烈建議您從urllibs遷移到python requests模塊。

說真的,值得5分鐘easy_install/pip並移植你的代碼。它將處理大多數SSL問題,使其更加優雅,而且不那麼痛苦。

+0

我正在考慮使用外部模塊,但我會真的更喜歡留在Python本地模塊... 感謝您的答覆,我會嘗試與python的請求,讓你知道。 –

+0

我知道想要保留在std lib中,但是請求是值得的。認真。 – rdodev

+0

有許多事情要求更好(包括OP在硬盤上做的一些事情,比如cookies)。但基本的SSL協商不是其中之一。它使用'ssl'模塊,就像'urllib'一樣。 – abarnert

相關問題