2013-11-23 5 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 

поэтому, я полагаю, что код верен.

Кроме того, код работал на моем Mac, когда я установил прокси-сервер для HTTPS на прокси-сервер с Fiddler.

Это трассировка pastebin.

Что мне не хватает? Связано ли это с OSX, python, сервером HTTPS или просто с моим Mac? Проблема возникает при квитировании с сервером, но я не понимаю, почему он работает в Linux.

+1

Как вы установили Python 3.3.3 на свой Mac? Двоичный установщик (если это один из python.org или иначе) или сборка источника (если это так, Homebrew, MacPorts или вручную)? Похоже, проблема связана с модулем 'ssl', и это очень легко получить, если вы, например, создаете, используя рецепт, разработанный для OpenSSL OS X 10.8, но на машине, на самом деле имеющей 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.

Серьезно, это стоит 5 минут, чтобы easy_install/pip и портировать ваш код. Он будет обрабатывать большинство вопросов SSL намного более изящным и намного менее болезненным.

+0

Я думал об использовании внешнего модуля, но у меня было бы действительно предпочли остаться с родными модулями python ... Спасибо за ответ, я попробую с python-запросами и дам вам знать. –

+0

Я понимаю, что хочу остаться внутри std lib, но запрос SO стоит того. Шутки в сторону. – rdodev

+0

Есть много запросов, которые лучше всего подходят (в том числе некоторые из вещей, которые делают OP, как куки). Но базовое согласование SSL не является одним из них. Он использует модуль 'ssl' так же, как и' urllib'. – abarnert

Смежные вопросы