You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 19:54:03