Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Exec运行异步函数_Python_Python Asyncio - Fatal编程技术网

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需要是一个列表。现在修复了。