Я некоторое время отлаживал свой код и обнаружил, что bash_shell(message,shell)
не может передать словарь shell
обратно в основной процесс. Словарь по-прежнему пуст, но когда я читаю (на самом деле, печать) shell
в bash_shell()
, он имеет значение. Что означает, может быть, потому что я передал значение переменной, но не псевдоним? Но я видел другие посты на других сайтах, люди делают это таким образом, и это прекрасно работает.
И я попытался сделать threading.Thread()
вместо multiprocessing.Process()
. Поток может передать значение обратно с помощью глобальных переменных (не пробовал метод параметров).
import multiprocessing,subprocess
# doing import stuff and blah blah blah
shell = dict()
shell['sh_out'] = ''
shell['py_out'] = ''
# code.... (in this part I also defined channel, guild, _globals, _locals,bot, etc...)
def bash_shell(msg,shell):
global channel,guild,_globals,_locals
try:
proc = subprocess.Popen(msg.split(" "), stdout=subprocess.PIPE,text=True)
except Exception as e:
shell['sh_out'] = str(e) + '\n$'
return
(out, err) = proc.communicate()
if err:
shell['sh_out'] = '```\n' + str(out) + "\n```\nError: `" + str(err) + "`\n```\n$```"
else:
shell['sh_out'] = '```\n'+ str(out) + "\n$```"
if len(rt) > 1988:
f = open("samples/shoutput.txt","w")
f.write(rt)
f.close()
return
#code.......
# @bot.event
def on_message(message):
#again code......
# if message.channel.name == 'bash':
# p = multiprocessing.Process(target=bash_shell,args=[message,shell])
p = multiprocessing.Process(target=bash_shell,args=['ls -al',shell])
p.start()
p.join(5)
if p.is_alive():
p.kill()
shell['sh_out'] = "Enough fork bomb. Please don't try to hang the bot."
p.join()
if len(shell['sh_out']) > 1998:
# await message.channel.send(file=discord.File(open("samples/shoutput.txt","r"),"output.txt"))
shell['sh_out'] = ''
return
print(shell)
# await message.channel.send(shell['sh_out'])
shell['sh_out'] = ""
return
on_message('a')
(примечание: если вам интересно, что я делаю, это просто бот, закодированный в discord.py. Код был изменен так, чтобы было проще понять и вызвать исключение.)
Так, что я сделал не так? Или есть лучшие способы сделать трюк? Почему он не может изменить словарь shell
, но другие могут это сделать?