如何向Docker版solc传递JSON及解决路径、JSON格式编译报错问题
报错原因定位
你当前遇到的JSON格式报错核心是命令参数顺序错误:--standard-json 参数的作用是告知solc从标准输入流读取JSON内容,该参数必须放在所有参数的最后。你将--allow-paths放在--standard-json之后,solc会把后面的参数内容当成JSON输入的一部分解析,自然会触发格式错误。
其次你把标准输出重定向到了out.json文件,subprocess.check_output读取到的返回内容为空,也会导致后续解析异常。
路径传递正确方案
Docker容器默认无法直接访问宿主机文件系统,需要通过挂载卷的方式映射目录:
- 用
-v 宿主机工作目录:容器内工作目录参数将你本地的代码路径挂载到容器内的固定路径,比如/workspace --allow-paths参数传容器内的映射路径即可,不需要传宿主机本地路径
直接传JSON字符串、返回字符串结果实现
完全不需要读写临时文件,可以直接将JSON字符串通过标准输入传递给solc,直接从标准输出读取编译结果,优化后的代码如下:
import json import subprocess compile_json = { "language": "Solidity", "sources": sources, "settings": { "outputSelection": { "*": { "*": [ "metadata", "evm.bytecode", "evm.bytecode.sourceMap" ] } } } } # 直接转成JSON字符串,不需要写本地文件 json_input = json.dumps(compile_json) docker_cmd = [ "docker", "run", "-i", # 开启标准输入交互,接收传入的JSON内容 "-v", f"{self.base_path}:/workspace", # 挂载本地工作目录到容器 "ethereum/solc:0.6.0", "--allow-paths", "/workspace", # 容器内的允许访问路径 "--standard-json" # 该参数必须放在最后 ] try: # 传入JSON字符串,直接捕获输出结果 run_result = subprocess.run( docker_cmd, input=json_input.encode("utf-8"), capture_output=True, check=True ) # 直接拿到JSON格式的编译结果,不需要读本地文件 compile_result = json.loads(run_result.stdout.decode("utf-8")) except subprocess.CalledProcessError as e: raise RuntimeError(f"编译失败,错误信息:{e.stderr.decode('utf-8')}")
内容的提问来源于stack exchange,提问作者hdries
相关产品推荐
相关产品推荐

