使用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
相关产品推荐
相关产品推荐

