7

OS X 用のアプリケーションを開発しています。アプリケーションには、安全な接続を使用して、python-requests を介してサーバーと通信することが含まれます。

パッケージ化する予定の python ファイルを実行でき、SSL 接続で成功します。ただし、ファイルを py2app でパッケージ化して実行しようとすると、次のエラーが発生します。

Traceback (most recent call last):
File "/Users/yossi/Documents/repos/drunken-octo-nemesis/dist/drunken-octo.app/Contents/Resources/__boot__.py", line 338, in <module>
    _run()
File "/Users/yossi/Documents/repos/drunken-octo-nemesis/dist/drunken-octo.app/Contents/Resources/__boot__.py", line 333, in _run
    exec(compile(source, path, 'exec'), globals(), globals())
File "/Users/yossi/Documents/repos/drunken-octo-nemesis/dist/drunken-octo.app/Contents/Resources/media_test.py", line 16, in <module>
    cmpbl.syncWithCloud()
File "src/compare_book_lists.pyc", line 172, in syncWithCloud
File "src/compare_book_lists.pyc", line 64, in checkMediaOnCloud
File "src/get_cloud_book_list.pyc", line 26, in getCloudFulfilledBookList
File "requests/api.pyc", line 55, in get
File "requests/api.pyc", line 44, in request
File "requests/sessions.pyc", line 354, in request
File "requests/sessions.pyc", line 460, in send
File "requests/adapters.pyc", line 250, in send
requests.exceptions.SSLError: [Errno 185090050] _ssl.c:340: error:0B084002:x509 certificate routines:X509_load_cert_crl_file:system lib
2013-06-12 11:39:49.119 drunken-octo[1656:707] drunken-octo Error

アプリケーションの一部を正常にパッケージ化できました。問題は、ターゲット ファイルがチェーンのどこかで要求に依存するときに始まります。

インポートを整理するために zc.buildout を使用しています。したがって、ビルドアウトによって作成されたローカルの Python インタープリターで実行しているため、残念ながら、システムの Python を変更する必要がなければ、修正は簡単に実装できます。ただし、すべての提案を歓迎します。私の仕様に合わせて修正するよう最善を尽くします。

これは、パッケージ化されたアプリを実行したときにのみ発生します。何か案は?

4

4 に答える 4

3

以前に受け入れられた回答は私にとってはうまくいきませんでした - おそらくリクエストの仕組みが変わったのでしょう。

これを解決するために、setup.py オプションを変更して、証明書の pem ファイルが存在する certifi パッケージを含めました。

OPTIONS = {'argv_emulation': True,'packages': ['certifi']}

次に、これを python requests 呼び出しに追加しました。

is_py2app = hasattr(sys, "frozen")
pem_path = "lib/python2.7/certifi/cacert.pem" if is_py2app else None 

...

requests.get(..., verify=pem_path)

これは、他の Python バージョンでは異なる場合があります。

于 2016-08-22T11:17:15.603 に答える