如何告诉 pyinstaller 使用带有 --onefile 选项的 python-certifi-win32

Dan*_*175 4 python pyinstaller

我有一个小脚本,它使用 Tableau Rest API 从 Tableau 视图下载数据。由于脚本在公司环境中运行,我必须使用 SSL。这就是python-certifi-win32包发挥作用的地方。安装带有pip install python-certifi-win32补丁的 certifi 包以使用本地计算机证书存储。从文档中:

该软件包在运行时修补 certifi,以包含来自 Windows 证书存储区的证书。

当我从源代码运行脚本时,这工作得很好,但是如果我使用 pyinstaller (带有选项--onefile)创建可执行文件,“运行时补丁”似乎不会发生,并且我收到“本地证书无法验证”错误,这与我在安装 python-certifi-win32 包之前得到的相同。

由于我对 Python 相当陌生,我无法弄清楚 python-certifi-win32 包到底是如何执行“运行时补丁”的。我已经尝试过该--hidden-import选项,但没有成功。

有什么建议如何告诉 pyinstaller (或我的脚本)在作为可执行文件调用时应用“python-certifi-win32 magic”?

小智 7

您不需要搞乱隐藏的导入,但您需要导入库本身。

在 PyInstaller 的运行时设置中执行时,该包会失去一些自动魔力。解决这个问题取决于您在哪里需要 winstore 证书,但这就是我为了让它在我需要的地方工作而所做的requests

if sys.platform == 'win32':
    import certifi_win32
    os.environ['REQUESTS_CA_BUNDLE'] = certifi_win32.wincerts.where()
    certifi_win32.generate_pem()
Run Code Online (Sandbox Code Playgroud)

设置REQUESTS_CA_BUNDLE将指向使用 certifi_win32 创建的存储的请求。该generate_pem函数将联合 PyInstaller 附带的证书包(位于<MEIPASS>\certifi)和 wincert 存储。生成的pem文件被写入到%LOCALAPPDATA%/.certifi/cacert.pem.