为何subprocess.check_call([sys.executable,..])可用而subprocess.run([...])不行?
Python离线依赖下载工具的SSL问题排查与解决
背景
我正在为无网络环境的机器编写Python模块安装工具,流程是先在联网机器上运行工具下载依赖包,再将包部署到无网机器。核心需求是通过脚本调用pip download完成依赖下载。
最初的实现与问题
最初使用subprocess.run执行命令:
subprocess.run(['py','-m','pip','download','-r','C:/.../libs/Python 3.8/requirements.txt','-d','C:/.../libs/Python 3.8','--python-version','3.8','--only-binary=:all:'])
执行时报错:the ssl module in Python is not available.
但直接在CMD中执行相同的命令却能正常运行,pip没有抛出SSL相关错误,且我确认VSCode和CMD使用的Python版本完全一致。
解决方案与现象
参考方案后,改用subprocess.check_call并传入sys.executable:
subprocess.check_call([sys.executable,'-m','pip','download','-r','C:/.../libs/Python 3.8/requirements.txt','-d','C:/.../libs/Python 3.8','--python-version','3.8','--only-binary=:all:'])
此时虽然仍有SSL警告和连接超时提示,但依赖库及其关联包能够成功下载。
疑问
我明白sys.executable的作用是确保调用当前脚本运行环境的pip,但不清楚为什么这个修改能解决之前subprocess.run遇到的SSL模块不可用问题。
内容的提问来源于stack exchange,提问作者be-cieutat
相关产品推荐
相关产品推荐

