Ошибки модуля Twilio Python после компиляции

Я написал простую программу, которая открывает файл csv и текст всех номеров в нем. Я использую Twilio ( twiliopython ) в качестве поставщика услуг. Мой код отлично работает как скрипт python. Однако, когда я скомпилирую скрипт (используя py2exe), ошибки exe-файла. Это ошибка, которую я получаю из файла журнала ….

Traceback (most recent call last): File "sms.py", line 39, in <module> File "twilio\rest\resources\messages.pyc", line 112, in create File "twilio\rest\resources\base.pyc", line 352, in create_instance File "twilio\rest\resources\base.pyc", line 204, in request File "twilio\rest\resources\base.pyc", line 129, in make_twilio_request File "twilio\rest\resources\base.pyc", line 101, in make_request File "httplib2\__init__.pyc", line 1570, in request File "httplib2\__init__.pyc", line 1317, in _request File "httplib2\__init__.pyc", line 1252, in _conn_request File "httplib2\__init__.pyc", line 1021, in connect File "httplib2\__init__.pyc", line 80, in _ssl_wrap_socket File "ssl.pyc", line 387, in wrap_socket File "ssl.pyc", line 141, in __init__ ssl.SSLError: [Errno 185090050] _ssl.c:340: error:0B084002:x509 certificate routines:X509_load_cert_crl_file:system lib 

Я не получаю эту ошибку, когда я использую не скомпилированный код (ниже)

  import sys #2 params --- /path/to/contact/file --- up to 160 char msg import csv import time from twilio.rest import TwilioRestClient ACCOUNT_SID = "**************************" AUTH_TOKEN = "**************************" client = TwilioRestClient(ACCOUNT_SID, AUTH_TOKEN) sys.argv.pop(0) contactFile = sys.argv[0] sys.argv.pop(0) msg = (' ').join(sys.argv) print contactFile print " " print msg info = [] with open(contactFile,'rb') as csvfile: reader = csv.reader(csvfile, delimiter=',', quotechar='|') for row in reader: info.append(row) contactCount = len(info)-1 if contactCount > 0: #remove first item from list because its not a value that is needed.... info.pop(0) for i in info: print " " contactName = i[0] phoneNumber = i[1] print "Texting " + contactName + "... \n" client.messages.create( to=phoneNumber, from_="+14782856136", body=msg ) time.sleep(1.5) else: print("SMSify Error \n The contact file doesn't have any contacts in it.") 

Любые мысли о том, что происходит?

РЕДАКТИРОВАТЬ:

Вот мой файл setup.py

 from distutils.core import setup import py2exe, sys, os sys.argv.append('py2exe') Mydata_files = [('cacert.pem', ['C:\\Python27\\Lib\\site- packages\\twilio\\conf\\cacert.pem'])] setup( console=['sms.py'], data_files = Mydata_files, options={ "py2exe":{ "bundle_files": 1, "compressed": True } } ) 

3 Solutions collect form web for “Ошибки модуля Twilio Python после компиляции”

Это произошло потому, что self-signed certificate файл self-signed certificate пропустил в комплекте.

Эта проблема одинакова для requests и модулей httplib2 .

Например, если у вас есть файл с именем req_example.py который использует модуль request :

 import requests url = 'https://google.com/' requests.get(url) 

Он работает, когда вы запускаете его как python req_example.py , но когда его связывает, он не работает.

Или, если у вас есть файл с именем http2_example.py который использует модуль http2 :

 import httplib2 url = 'https://google.com/' http = httplib2.Http() http.request(url) 

Он работает, когда вы запускаете его как python http2_example.py , но когда он связывается с ним, он не работает.

Чтобы исправить это, у вас есть два варианта: один bad и один good .

  1. Отключить проверку сертификатов SSL:

    Чтобы сделать это для модуля requests :

     import requests url = 'https://google.com/' requests.get(url, verify=False) 

    А для модуля httplib2 :

     import httplib2 http = httplib2.Http(disable_ssl_certificate_validation=True) http.request(url) 
  2. Добавить файл self-signed certificate для объединения:

    Для модуля requests файл cacert.pem находится в:

    .../PythonXX/lib/site-packages/requests/cacert.pem

    А для модуля httplib2 находится:

    .../PythonXX/lib/site-packages/httplib2/cacerts.txt

    Для каждого из них вы можете скопировать его в свой проект (или просто обратиться к нему),

    И config setup.py для его включения:

     setup(console=['temp.py'], # for `requests` module data_files=['cacert.pem'] ) # or data_files=['cacerts.txt'] ) for `httplib2` 

    И измените свой код на это, для модуля request :

     import os import requests url = 'https://google.com/' cert ='cacert.pem' # or os.environ['REQUESTS_CA_BUNDLE'] = cert os.environ['REQUESTS_CA_BUNDLE'] = os.path.join(os.getcwd(), cert) requests.get(url) 

    А для модуля httplib2 :

     import httplib2 cert = 'cacerts.txt' http = httplib2.Http(ca_certs=cert) http.request(url) 

    Или, если ваша версия httplib2 равна 0.8 , вы можете создать файл с именем ca_certs_locater.py и определить функцию get , возвращающую путь файла ca_certs .

     def get(): return 'cacerts.txt' 

Итак, теперь для вашей ошибки и для модуля twilio , он использует httplib2 , а cacert.pem – в:

.../twilio/conf/cacert.pem

Поэтому вам нужно добавить этот файл в setup.py как описано выше.

Но у twilio есть функция с именем get_cert_file , ca_cert файл httplib2 на httplib2 .

Я думаю, что если вы используете ca_certs_locater.py , описанный выше, он также будет работать для этого, но если нет, у вас еще есть ugly опция, поэтому вы можете get_cert_file функцию twilio для twilio :

 from twilio.rest.resources.base import get_cert_file get_cert_file = lambda: 'cacert.pem' 

Обратите внимание, что это может быть проблемой для twilio или даже для py2exe или PyInstaller .

У меня была такая же проблема с twilio и pyinstaller, и я смог исправить ее, изменив модуль base.py в twilio \ rest \ resources:

  def get_cert_file(): """ Get the cert file location or bail """ # XXX - this currently fails test coverage because we don't actually go # over the network anywhere. Might be good to have a test that stands up a # local server and authenticates against it. try: # Apparently __file__ is not available in all places so wrapping this # in a try/catch current_path = os.path.realpath(__file__) #ca_cert_path = os.path.join(current_path, "..", "..", "..", (old path) # "conf", "cacert.pem") ca_cert_path = os.getcwd() + '\Config\cacert.pem' (my new path) return os.path.abspath(ca_cert_path) 

(Я сохраняю файл cacert.pem в папке Config из моего основного каталога скриптов)

Вероятно, для py2exe возможно собрать не-Python-файлы, например шаблоны или в этом случае сертификат SSL, хранящийся в cacert.pem. Обычно это делается автоматически с помощью MANIFEST.in, но я не уверен, как этот проект справляется с этим. Проверьте документацию для получения дополнительной информации.

  • Что такое оператор «& =» и почему Twilio использует его при сравнении строк?
  • Python - лучший язык программирования в мире.