Py-solc 和 Solidity 导入

Posted

技术标签:

【中文标题】Py-solc 和 Solidity 导入【英文标题】:Py-solc and solidity imports 【发布时间】:2018-10-18 17:14:29 【问题描述】:

如何编译通过py-solc 执行相对导入的solidity 文件?这是一个最小的例子:

目录结构

我的项目 - 主要.py - bar.sol - baz.sol

main.py:

从 solc 导入 compile_source def get_contract_source(文件名): 使用 open(file_name) 作为 f: 返回 f.read() contract_source_code = get_contract_source("bar.sol") compiled_sol = compile_source(contract_source_code) # 编译好的源代码

baz.sol:

编译指示 ^0.4.0; 合同 baz 功能巴兹()

bar.sol:

编译指示 ^0.4.0; 将“./baz”导入为 baz; 合约栏 函数栏()

当我尝试运行 python 文件时,出现以下错误:

solc.exceptions.SolcError:执行过程中发生错误 > 命令:`solc --combined-json abi,asm,ast,bin,bin-runtime,clone-bin,devdoc,interface,opcodes,userdoc` > 返回码:`1` > 标准错误: > 标准输出: :17:1: 错误:找不到源“baz”:文件超出允许的目录。 将“./baz”导入为 baz; ^---------------------^

我仍然不是 100% 清楚导入的工作原理。我有reviewed the docs,似乎我需要将一些额外的参数传递给compile_source 命令。我发现了一些可能有用的文档here,我认为我需要使用allow_pathscompile_files,我会的。如果我在得到答案之前找到解决方案,我会发布我的发现。

【问题讨论】:

【参考方案1】:

好的,原来compile_files 正是我需要的。

新的编译命令是

导入操作系统 PROJECT_ROOT = os.path.dirname(os.path.dirname(__file__)) 编译溶胶 = 编译文件([os.path.join(self.PROJECT_ROOT,“bar.sol”),os.path.join(self.PROJECT_ROOT,“baz.sol”)])

事实证明我的导入是错误的。我需要像import "./baz.sol" as baz; 一样导入baz - 我缺少.sol 扩展。

【讨论】:

以上是关于Py-solc 和 Solidity 导入的主要内容,如果未能解决你的问题,请参考以下文章

智能合约语言 Solidity 教程系列1 - 类型介绍

Solidity零基础入门Solidity编写智能合约代码

Solidity零基础入门Solidity编写智能合约代码

Solidity零基础入门Solidity编写智能合约代码

Solidity零基础入门Solidity编写智能合约代码

VScode Solidity 扩展 - 找不到 openzepplin 导入