在冻结的应用程序中使用请求时出错 [英] Error using Requests in a frozen app

查看:107
本文介绍了在冻结的应用程序中使用请求时出错的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在冻结的应用程序中使用出色的请求库。该代码在解释时可以正常工作,但是在生成dist可执行文件时将停止工作。 ://stackoverflow.com/questions/15157502/requests-library-missing-file-after-cx-freeze>请求库:cx_freeze后丢失文件)



我的setup.py文件:

  import esky.bdist_esky 
从esky.bdist_esky导入可执行文件为Executable_Esky
来自cx_Freeze导入设置,可执行
来自myapp导入版本
导入request.certs

包= [
'PIL',
'_winreg ',
'esky',
]

includes = [
'PySide',
'sys',
'os',
'datetime',
'threading',
'Queue',
'uuid',
'requests',
]

不包括= [
'TKinter',
'tcl',
'ttk',
]

include_files = [ icon-16px .ico,
icon-32px.ico,
logo-t-160x56.png,
]

设置(
脚本= [
Executable_Esky(
myapp.py,
gui_only = False,
图标= icon-16px.ico,
),
],
data_files = include_files,
options = { build_exe:
{ packages:软件包,
includes:包含,
include_files:include_files + [(requests.certs.where(),'cacert.pem') ],
排除:排除,
优化:2,
icon: icon-16px.ico,
},
bdist_esky :{
'freezer_module': cxfreeze,
'includes':include,
'excludes':excludes,
},
},
可执行文件= [Executable(script = myapp.py,base = Win32GUI)],

Tracebac k:

 跟踪(最近一次通话最近):
文件 C:\Users\Fernando\ Dropbox全能老板 myapp_client testes cx
_freeze\qt_gui\interface_qt.py,第45行,登录
r = requests.post(url,data = data)
文件 C:\Python27\lib\site-packages\requests\api.py,第88行,在后
返回请求中( post,url,data = data,** kwargs)
文件 C:\Python27\lib\site-packages\requests\api.py,第44行,请求
返回session.request( method = method,url = url,** kwargs)
文件 C:\Python27\lib\site-packages\requests\sessions.py,行383,在要求
t中
resp = self.send(prep,** send_kwargs)
发送文件 C:\Python27\lib\site-packages\requests\sessions.py,行486,在发送中
r = adapter.send(request,** kwargs)
文件 C:\Python27\lib\site-packages\requests\adapters.py,第385行,在发送
引发SSLError(e)
request.exceptions.SSLError:[Errno 185090050] _ssl .c:343:错误:0B084002:x509
证书例程:X509_load_cert_crl_file:系统lib


解决方案

我在github( https://github.com/kennethreitz/requests/issues/557#issuecomment-6420819 )。



首先,我将cacert.pem文件放在项目文件夹中,然后将其包含在冻结的应用程序中:

p>

  include_files = [ icon-16px.ico,
icon-32px.ico,
logo-t-160x56.png,
cacert.pem,
]

设置(
脚本= [
Executable_Esky(
myapp.py,
gui_only = False,
图标= icon-16px.ico,
),
],
data_files = include_files,
options = { build_exe:
{ packages:软件包,
includes:包括,
include_files:include_files,
excludes:排除,
optimize:2,
icon: icon-16px.ico,
},
bdist_esky:{
'freezer_modu le': cxfreeze,
'includes'包括,
'excludes':排除,
},
},
可执行文件= [Executable(script = myapp.py,base = Win32GUI)],

最后,您必须使用请求在每个POST或GET中指定此证书,例如:

  r = requests.post(URL,data = data,verify = os.path.join(appdata,'cacert.pem'))

XD


I am trying to use the excelent requests library in a frozen app. The code works fine when interpreted, but it stops working when I generate the dist executable.

I tried this solution, but it is not working (Requests library: missing file after cx_freeze)

My setup.py file:

import esky.bdist_esky
from esky.bdist_esky import Executable as Executable_Esky
from cx_Freeze import setup, Executable
from myapp import VERSION
import requests.certs

packages = [
    'PIL',
    '_winreg',
    'esky',
    ]

includes = [
    'PySide',
    'sys',
    'os',
    'datetime',
    'threading',
    'Queue',
    'uuid',
    'requests',
]

excludes = [
    'TKinter',
    'tcl',
    'ttk',
]

include_files =["icon-16px.ico",
                "icon-32px.ico",
                "logo-t-160x56.png",
                ]

setup(
    scripts = [
        Executable_Esky(
            "myapp.py",
            gui_only = False,
            icon = "icon-16px.ico",
        ),
    ],
    data_files = include_files,
    options={"build_exe":
                 {"packages":packages,
                  "includes": includes,
                  "include_files": include_files + [(requests.certs.where(),'cacert.pem')],
                  "excludes": excludes,
                  "optimize": 2,
                  "icon":"icon-16px.ico",
                 },
             "bdist_esky":{
                 'freezer_module':"cxfreeze",
                 'includes': includes,
                 'excludes': excludes,
             },
    },
    executables = [Executable(script="myapp.py",base="Win32GUI")],
)

Traceback:

Traceback (most recent call last):
  File "C:\Users\Fernando\Dropbox\the all-seeing boss\myapp_client\testes\cx
_freeze\qt_gui\interface_qt.py", line 45, in login
    r = requests.post(url, data=data)
  File "C:\Python27\lib\site-packages\requests\api.py", line 88, in post
    return request('post', url, data=data, **kwargs)
  File "C:\Python27\lib\site-packages\requests\api.py", line 44, in request
    return session.request(method=method, url=url, **kwargs)
  File "C:\Python27\lib\site-packages\requests\sessions.py", line 383, in reques
t
    resp = self.send(prep, **send_kwargs)
  File "C:\Python27\lib\site-packages\requests\sessions.py", line 486, in send
    r = adapter.send(request, **kwargs)
  File "C:\Python27\lib\site-packages\requests\adapters.py", line 385, in send
    raise SSLError(e)
requests.exceptions.SSLError: [Errno 185090050] _ssl.c:343: error:0B084002:x509
certificate routines:X509_load_cert_crl_file:system lib

解决方案

I got this following this issue on github(https://github.com/kennethreitz/requests/issues/557#issuecomment-6420819). Thank you Martjin Pieters for this tip.

First of all, I put the cacert.pem file in my project's folder and then I included this in the frozen app:

include_files =["icon-16px.ico",
                "icon-32px.ico",
                "logo-t-160x56.png",
                "cacert.pem",
                ]

setup(
    scripts = [
        Executable_Esky(
            "myapp.py",
            gui_only = False,
            icon = "icon-16px.ico",
        ),
    ],
    data_files = include_files,
    options={"build_exe":
                 {"packages":packages,
                  "includes": includes,
                  "include_files": include_files,
                  "excludes": excludes,
                  "optimize": 2,
                  "icon":"icon-16px.ico",
                 },
             "bdist_esky":{
                 'freezer_module':"cxfreeze",
                 'includes': includes,
                 'excludes': excludes,
             },
    },
    executables = [Executable(script="myapp.py",base="Win32GUI")],
)

And for the last you must indicate this certificate in each POST or GET using requests, like this:

r = requests.post(url, data=data, verify = os.path.join(appdata,'cacert.pem'))

XD

这篇关于在冻结的应用程序中使用请求时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆