我正在一个anaconda虚拟环境中用Python 3.6构建一个windows服务,我用python请求发出一个post请求:requests.post(url, files=files, data=data, headers=headers)
创建服务后,在我的Windows机器(拥有创建服务的源代码的机器)上,它立即工作。当我在另一台Windows机器上安装此服务时,我不断获得SSL:CERTIFICATE_VERIFY_FAILED.我在第三台Windows机器上安装了它,它工作正常(但不幸的是,这不是我们需要它工作的机器)。
我尝试过的事情:
1.在创建服务之前,在我的虚拟环境中安装了带有conda的python-certifi-win32
。
1.指定一个. pem文件的路径,该文件包含url的证书链,并使用verify参数添加该文件,因此我的请求如下:requests.post(url, files=files, data=data, headers=headers, verify='path\to\pemfile')
。这在我的机器上有效,但在另一台上无效。
我在两台电脑上都打印出了requests.certs.where()
,它们都说C:\Windows\TEMP\_MEXXXX\certifi\cacert.pem
。
如何使我的服务在所有计算机上运行相同的服务?
更新:可重现示例:
# debugFile.py
import servicemanager
import socket
import win32event
import win32service
import win32serviceutil
import traceback
import sys, getopt
import requests
class SCPWorker:
def __init__(self):
self.running = True
def test_function(self):
data = {}
token = 'auth token for url'
response = requests.post(custom_url, data=data, headers={'Authorization': "Token " + token})
class StoreScp(win32serviceutil.ServiceFramework):
_svc_name_ = "Service"
_svc_display_name_ = "Debug Service"
_svc_description_ = "description"
def __init__(self, args):
self.worker = SCPWorker()
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
socket.setdefaulttimeout(60)
def SvcStop(self):
try:
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
self.worker.stop()
self.running = False
except:
servicemanager.LogErrorMsg(traceback.format_exc())
def SvcDoRun(self):
try:
self.worker.test_function()
while rc != win32event.WAIT_OBJECT_0 and rc != win32event.WAIT_FAILED and rc != win32event.WAIT_TIMEOUT and rc != win32event.WAIT_ABANDONED:
rc = win32event.WaitForSingleObject(self.hWaitStop, 5000)
if rc == win32event.WAIT_OBJECT_0:
servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STARTED,
('Service stopped', ''))
else:
servicemanager.LogMsg(servicemanager.EVENTLOG_ERROR_TYPE,
servicemanager.PYS_SERVICE_STOPPED,
('Service quit unexpectedly with status %d' % rc, ''))
except:
servicemanager.LogErrorMsg(traceback.format_exc())
if __name__ == '__main__':
if len(sys.argv) == 1:
servicemanager.Initialize()
servicemanager.PrepareToHostSingle(StoreScp)
servicemanager.StartServiceCtrlDispatcher()
else:
win32serviceutil.HandleCommandLine(StoreScp)
然后运行pyinstaller -F --hidden-import=win32timezone DebugFile.py
创建exe,然后在计算机上安装exe。
1条答案
按热度按时间wlzqhblo1#
我一直不明白为什么它在另一台电脑上不起作用,但我确实设法使一个变通方案起作用。首先我确保我的
pyinstaller
至少是4.10
,然后我安装了pip-system-certs
。最后我在我的python文件的顶部添加了importpip_system_certs.wrapt_requests
。这个库意味着我必须使用pip而不是conda安装所有东西。