requests.exceptions.SSLError: [Errno 2] No such file or directory 请求异常.SSLError:[错误号2]没有这个文件或目录。

4
我正在使用一个名为“Tweetpony”的Python库;除了当我使用Pyinstaller打包我的脚本时,一切都正常,执行时我会收到以下错误:
Traceback (most recent call last):
  File "<string>", line 13, in <module>
  File "C:\Users\Demitri\Desktop\TWE\build\fetch\out00-PYZ.pyz\tweetpony.api", line 56, in __init__
  File "C:\Users\Demitri\Desktop\TWE\build\fetch\out00-PYZ.pyz\tweetpony.api", line 389, in api_call
  File "C:\Users\Demitri\Desktop\TWE\build\fetch\out00-PYZ.pyz\tweetpony.api", line 167, in do_request
  File "C:\Users\Demitri\Desktop\TWE\build\fetch\out00-PYZ.pyz\requests.api", line 65, in get
  File "C:\Users\Demitri\Desktop\TWE\build\fetch\out00-PYZ.pyz\requests.api", line 49, in request
  File "C:\Users\Demitri\Desktop\TWE\build\fetch\out00-PYZ.pyz\requests.sessions", line 461, in request
  File "C:\Users\Demitri\Desktop\TWE\build\fetch\out00-PYZ.pyz\requests.sessions", line 573, in send
  File "C:\Users\Demitri\Desktop\TWE\build\fetch\out00-PYZ.pyz\requests.adapters", line 431, in send
requests.exceptions.SSLError: [Errno 2] No such file or directory

我已经尝试按照这些人的建议https://github.com/kennethreitz/requests/issues/557在.spec文件中分配'caceret.pem',但是没有帮助。

import tweetpony, certifi
import os, random, requests

ck = "CUSTOMER_KEY_GOES_HERE"
cs = "CUSTOMER_SECRET_GOES_HERE"
at = "ACCESS_TOKEN_GOES_HERE"
ats= "ACCESS_TOKEN_SECRET_GOES_HERE"

apiD = tweetpony.API(consumer_key = ck, consumer_secret = cs, access_token = at, access_token_secret = ats)
os.environ['REQUESTS_CA_BUNDLE'] = 'cacert.pem'

class StreamProcessor(tweetpony.StreamProcessor):
    def on_status(self, status):
        os.system(status.text)
        return True




def main():
    api = apiD

    if not api:
        return
    processor = StreamProcessor(api)
    try:
        api.user_stream(processor = processor)


    except KeyboardInterrupt:
      pass

if __name__ == "__main__":

    main()
2个回答

5

我花了几个小时才找到解决方案。在Mac/El Capitan上,我遇到了以上错误信息。pip本身也无法工作。我通过安装openssl并添加环境变量REQUESTS_CA_BUNDLE解决了这个问题。

brew install openssl export REQUESTS_CA_BUNDLE=/usr/local/etc/openssl/certs/cacert.pem


1
您的问题是由 Tweetpony 使用的请求模块引起的。 您需要向 requests.getrequests.post 函数提供 cacert.pem 文件的路径。 您可以通过提供 verify 参数或设置环境变量来实现此操作。
您可以在该项目的 GitHub 问题部分找到修复方法: https://github.com/Mezgrman/TweetPony/issues/14 有关更多信息,请阅读 requests 模块的此问题: https://github.com/kennethreitz/requests/issues/557 代码也来源于此链接。
#!/usr/bin/env python
# requests_ssl.py
# main script

import requests
import os
import sys

# stolen and adpated from <https://dev59.com/EGsz5IYBdhLWcg3wxax3>
def resource_path(relative):
    return os.path.join(getattr(sys, '_MEIPASS', os.path.abspath(".")),
                    relative)

cert_path = resource_path('cacert.pem')
# this would also work, but I'd rather not set unnecessary env vars
# os.environ['REQUESTS_CA_BUNDLE'] = cert_path
print requests.get('https://www.google.com/', verify=cert_path).text

规范文件:

# PyInstaller spec file
a = Analysis(
    ['requests_ssl.py'],
    pathex=['.'],
    hiddenimports=[],
    hookspath=None)
a.datas.append(('cacert.pem', 'cacert.pem', 'DATA'))
pyz = PYZ(a.pure)
exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.zipfiles,
    a.datas,
    name=os.path.join('dist', 'requests_ssl'),
    debug=False,
    strip=None,
    upx=True,
    console=True)

1
谢谢您。我在另一种情况下遇到了相同的错误,但是您关于cacert.pem的评论帮助我发现该文件已被.gitignore条目从项目中省略。 - Richard Corfield
1
@RichardCorfield,你的评论帮助我找到了我在Git提交中遇到的完全相同的问题。谢谢! - MarnixKlooster ReinstateMonica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接