13

サイトへのログインを含み、CSRF Coo​​kie の設定を必要とする Python プログラムのテストを終了しました。を使用してexeとしてパッケージ化しようとしましたpy2exeが、ソケットエラーが発生しました。を試してみると、同じ問題が発生しPyInstallerます。Errno をグーグルで検索すると、同じ問題を抱えている他の人が何人か見つかりました。そのため、問題は SLL 証明書の場所に関係していることがわかります。

これは、site_agentロギング呼び出しを含む私のクラスです。

    class site_agent:
        self.get_params()
        URL = root_url + '/accounts/login/'        
        # Retrieve the CSRF token first
        self.agent = requests.session()
        self.agent.get(URL)  # retrieves the cookie # This line throws the error
        self.csrftoken = self.agent.cookies['csrftoken']    
        # Set up login data including the CSRF cookie
        login_data = {'username': self.username,
                      'password': self.password,
                      'csrfmiddlewaretoken' : self.csrftoken}
        # Log in
        logging.info('Logging in')
        response = self.agent.post(URL, data=login_data, headers=hdr)

エラーは次のself.agent.get(URL)行で発生し、トレースバックには次のように表示されます。

Traceback (most recent call last):
  File "<string>", line 223, in <module>
  File "<string>", line 198, in main
  File "<string>", line 49, in __init__
  File "C:\pyinstaller-2.0\pyinstaller-2.0\autoresponder\b
uild\pyi.win32\autoresponder\out00-PYZ.pyz\requests.sessions", line 350, in get
  File "C:\pyinstaller-2.0\pyinstaller-2.0\autoresponder\b
uild\pyi.win32\autoresponder\out00-PYZ.pyz\requests.sessions", line 338, in requ
est
  File "C:\pyinstaller-2.0\pyinstaller-2.0\autoresponder\b
uild\pyi.win32\autoresponder\out00-PYZ.pyz\requests.sessions", line 441, in send

  File "C:\pyinstaller-2.0\pyinstaller-2.0\autoresponder\b
uild\pyi.win32\autoresponder\out00-PYZ.pyz\requests.adapters", line 331, in send

requests.exceptions.SSLError: [Errno 185090050] _ssl.c:336: error:0B084002:x509
certificate routines:X509_load_cert_crl_file:system lib

これは、問題が にあるということrequests.adaptersですか?

もしそうなら、インストールした Python パッケージでそれを編集して cacert.pem を別の場所で探し、py2exeまたはPyInstallerで exe を再構築してから、インストールしたバージョンの Python に戻すことはできますか?

編集

all and呼び出しを使用してコンパイルPyInstallerおよび設定した後、プログラムが実行されるようになりました。しかし、SSL には何らかの理由があります。誰かにツールを使用させる前に、このエラーを修正できるようにしたいと考えています。verify=Falserequests.get()requests.post()

4

4 に答える 4

7

「リクエスト」モジュールを使用している場合、これは簡単に解決できます。

1)「リクエスト」モジュールが使用されているメインのpythonファイルに以下のコードを配置します

os.environ['REQUESTS_CA_BUNDLE'] = "certifi/cacert.pem"

2) exe が存在する配布可能なフォルダー内に、「certifi」というフォルダーを作成し、その中に「cacert.pem」ファイルを配置します。

3)「cacert.pem」ファイルは次の方法で見つけることができます

pip install certifi

import certifi
certifi.where()

素晴らしい..これで、配布可能ファイルには、ssl 呼び出しを検証するために必要な証明書が含まれます。

于 2015-12-11T15:38:12.980 に答える
5

pyinstaller を使用している場合... を含むリクエスト lib 用にhook-requests.pyファイルを作成しますPyInstaller\hooks\

from hookutils import collect_data_files

# Get the cacert.pem
datas = collect_data_files('requests') 
于 2014-09-24T14:12:34.453 に答える