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

使用exec()执行合约部署代码触发Python SyntaxError异常求助

问题解决:Brownie动态部署合约的SyntaxError错误

错误原因

你遇到的语法错误,是因为用f-string拼接exec执行的代码时,account对象被直接转换成了字符串表示(如<Account '0x66aB6D9362d4F35596279692F0251Db635165871'>),这不是合法的Python语法,导致exec解析失败。

解决方案

推荐方案:避免使用exec,用动态导入规范实现

用Python标准库importlib动态获取合约类,直接调用deploy方法,既安全又不会出现语法问题:

from brownie import accounts, network
import sys
import importlib

sys.path.append("../")
import globalVars

def main():
    # 动态导入合约类
    brownie_module = importlib.import_module("brownie")
    contract_class = getattr(brownie_module, globalVars.contractName)

    network.connect('development')
    accounts.add()
    account = accounts[0]
   
    transactDetails = {'from' : account}
    # 直接调用deploy,用**展开交易细节为关键字参数
    contract_instance = contract_class.deploy(*globalVars.constructorInputs, **transactDetails)

    return contract_instance

备选方案:若坚持使用exec

不要直接拼接字典,而是使用当前作用域内的变量名,让exec直接引用变量:

from brownie import accounts, network
import sys

sys.path.append("../")
import globalVars

def main():
    import_str = "from {0} import {1}".format("brownie", globalVars.contractName)
    exec(import_str)

    network.connect('development')
    accounts.add()
    account = accounts[0]
   
    # 直接在exec代码中引用account变量,不用拼接字典
    prompt = f"contract_instance = {globalVars.contractName}.deploy(*globalVars.constructorInputs, from=account)"
    exec(prompt)

    return contract_instance

说明

第一种方案更符合Python编码规范,避免了exec带来的潜在安全风险和语法问题,同时行为完全匹配你提供的标准部署代码逻辑。

内容的提问来源于stack exchange,提问作者mnsdali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 21:17:15