Python Exec运行异步函数
我知道我不应该使用Python Exec运行异步函数,python,python-asyncio,Python,Python Asyncio,我知道我不应该使用exec,因为它不安全,但它运行的代码来自同一个文件,是一个字符串。如何使用exec运行异步函数?如果我尝试,它总是在函数外部返回我SyntaxError:“wait” 编辑:这是我正在使用的代码exec: async def command_processor(guild): while True: commands = {"[1] - Bot Permissions abrufen" : "print_permissio
exec
,因为它不安全,但它运行的代码来自同一个文件,是一个字符串。如何使用exec
运行异步函数?如果我尝试,它总是在函数外部返回我SyntaxError:“wait”
编辑:这是我正在使用的代码exec
:
async def command_processor(guild):
while True:
commands = {"[1] - Bot Permissions abrufen" : "print_permissions(guild)",
"Derzeit nicht verwendbar - [2] - Invite zu Gilde erstellen (max Nutzungen pro Invite: 1)" : "await print_invite(guild)",
"[3] - Gebannte Benutzer auflisten (benötigt Berechtigung {Mitglieder bannen}" : "print_banned(guild)",
"[4] - Ausgewählten Server wechseln" : "change_guild()",
"[5] - Ausgewählten Bot wechseln" : "change_bot()",
"[6] - Beenden" : "sys.exit()"
}
print("\n\n--------------- Befehle ---------------\n")
for i in range(len(commands.keys())):
print(list(commands.keys())[i])
sel = input()
print()
try:
int(sel)
except:
print("Bitte hier nur die Zahl eingeben")
if int(sel) in range(len(commands.keys())):
exec(list(commands.values())[int(sel)-1])
我想你可以做到。exec
的问题是它不返回任何内容,因此您需要使用eval
。我认为这是可行的:
async def command_处理器(公会):
尽管如此:
commands={“[1]-Bot权限”:“打印权限(公会)”,
“Derzeit nicht verwendbar-[2]-邀请zu Gilde erstellen(max Nutzungen pro邀请:1)”:“等待打印邀请(公会)”,
“[3]-Gebannte Benutzer auflisten(benötigt Berechtigung{Mitglieder bannen}):“禁止印刷(行会)”,
“[4]-Ausgewählten Server wechseln:“change_guild()”,
“[5]-Ausgewählten Bot wechseln”:“change_Bot()”,
[6]-Beenden:“sys.exit()”
}
# ...
如果int(sel)在范围内(len(commands.keys()):
等待评估(列表(commands.values())[int(sel)-1])
但是这里不需要使用eval
,你会损失很多。一个简单的方法是使用dict,大致如下:
commands={1:{“description”:“[1]-Bot权限”,“command”:print_权限,“args”:[guild]},
# ...
}
对于命令中的cmd:
打印(cmd['description'])
# ...
所选命令=命令[sel]
等待选定的_命令['command'](*选定的_命令['args'])
但这会变得很棘手,因为有时候你有一个协同程序,有时候有一个常规方法。要解决这个问题,我想你可以这样做:
命令={
1:{“description”:“[1]-Bot权限”,“exec”:print_权限,“args”:[guild]},
2:{“描述”:“Derzeit nicht verwendbar-[2]-邀请zu Gilde erstellen(max Nutzungen pro邀请:1)”,“执行官”:打印邀请,args:[guild]},
# ...
}
对于命令中的cmd:
打印(cmd['description'])
# ...
所选命令=命令[sel]
如果asyncio.iscoroutinefunction(选中的_命令['exec']):
等待选定的_命令['exec'](*选定的_命令['args'])
其他:
选定的_命令['exec'](*选定的_命令['args'])
最后一点:我们现在有需要在两个不同位置按下的键,这让我很紧张。这最终会导致流泪,记住我的话。我会这样做:
命令=[
{
“说明”:“[{keynum}]-Bot权限”,
“exec”:打印权限,“args”:[guild]
},
{
“说明”:“Derzeit nicht verwendbar-[{keynum}]-邀请Gilde erstellen(max Nutzungen pro邀请:1)”,
“exec”:打印邀请,“args”:[行会]
},
]
对于keynum,枚举中的命令(命令):
打印(命令['description'].格式(keynum=keynum))
我还没有测试过该代码,所以可能有一个bug,但你知道了。出于好奇,如果代码来自同一个文件,为什么它需要是字符串?为什么不能只是代码?(问题中的一个示例可能会有所帮助。)这只是为了我可以更容易地扩展它,因为我有一个字典,其中描述了什么将被打印为键,命令将作为值运行。为什么不将命令作为值呢?什么?我将命令作为值…不,您将字符串作为值。您可以将方法作为值:{'1.Exit':sys.Exit}
。然后你可以稍后再做list(commands.values())[int(sel)-1])()
。我刚收到这个错误TypeError:print_invite()参数*后面必须是行selected_command['command'](*selected_command['args'])
当然了!抱歉。args需要是一个列表。现在修复了。