Solidity的install_solc()函数无限加载无法完成运行问题求助
问题根因
install_solc默认会从GitHub的Solidity发行页拉取对应版本的编译器二进制包,90%以上的无限加载问题都是由国内网络访问GitHub不稳定、DNS解析失败导致的下载请求无响应,此外也可能是本地缓存目录权限不足、已有版本冲突导致。
排查思路
- 开启下载进度显示,确认是否为网络卡住:将
install_solc("v0.7.0")替换为install_solc("v0.7.0", show_progress=True),运行后如果进度条长时间不动,即可确定是网络下载问题 - 检查本地是否已存在对应版本solc:运行以下代码确认已安装的编译器版本,若已包含v0.7.0可直接跳过安装步骤
from solcx import get_installed_solc_versions print(get_installed_solc_versions()) - 检查缓存目录权限:py-solc-x默认会把下载的solc存在用户根目录下的
.solcx文件夹内,确认该目录是否有当前用户的读写权限,权限不足会导致下载完成后写入卡住
解决方案
- 前置版本判断,避免重复安装
将原来的安装代码替换为以下逻辑,已安装过对应版本就不会再触发下载:
from solcx import get_installed_solc_versions, install_solc TARGET_SOLC_VERSION = "v0.7.0" if TARGET_SOLC_VERSION not in get_installed_solc_versions(): install_solc(TARGET_SOLC_VERSION, show_progress=True)
- 手动导入solc二进制包(无网络需求)
- 自行获取对应操作系统的Solidity v0.7.0版本二进制可执行文件
- 将文件重命名为
solc-v0.7.0(Windows系统保留.exe后缀) - 把重命名后的文件放到用户根目录下的
.solcx文件夹中,没有该文件夹可手动新建 - 再次运行代码即可直接识别本地的solc版本,无需走下载流程
- 配置网络代理
如果确定是网络问题,可在运行代码前给当前终端配置全局代理,或者在Python代码开头临时注入代理环境变量:
import os # 替换为你本地的代理地址和端口 os.environ["HTTP_PROXY"] = "http://127.0.0.1:7890" os.environ["HTTPS_PROXY"] = "http://127.0.0.1:7890" # 后面接原有的install_solc等逻辑
- 权限问题修复
如果是.solcx目录权限不足,可手动给该目录授予当前用户读写权限,或者指定自定义缓存目录:
from solcx import install_solc import os # 指定当前项目下的solc_cache文件夹为缓存目录,无需系统权限 custom_cache = os.path.join(os.getcwd(), "solc_cache") os.makedirs(custom_cache, exist_ok=True) install_solc("v0.7.0", solcx_home=custom_cache)
内容的提问来源于stack exchange,提问作者Yuki Yuminaga
相关产品推荐
相关产品推荐

