Citat:
Ursprungligen postat av AquaRegia
Flummig rubrik kanske.. men det är såhär att jag håller på med en IRC-bot, och jag vill att den ska kunna utföra allt man säger åt den att göra. Vad jag har förstått så finns det två saker man kan använda, eval och exec.
Eval tar t.ex. strängen "3+6*2" och returnerar då 15. Försöker man använda t.ex. "print 3+6*2" eller en import eller liknande så kraschar botten.
Exec tar också en sträng (bland annat) som parameter, men den returnerar ingenting, den utför bara det som står i strängen.
Så jag vill på något sätt att botten ska skicka tillbaka resultatet utav det som hände, så om uppgiften var "print 5+5" så ska den returnera 10, var uppgiften "5+5" ska den inte returnera någonting alls osv.
Någon som vet vad jag är ute efter?
Jag vill först och främst avråda dig från att använda eval och exec, säkerhetsriskerna är alldeles för stora. Bäst vore om du enbart tillät vissa kommandon att köras och att du skrev speciell kod för att parsa och köra dessa. Vill du ändå fortsätta råder jag dig att köra programmet med en användare med få rättigheter.
Om du vill kunna använda ett statement som print är det exec du vill ha. eval kan enbart utvärdera uttryck. Vet inte om det är särskilt snyggt, men man kan få tag i det som skrivs till stdout genom att ändra värde på sys.stdout:
Kod:
import sys
import StringIO
output = StringIO.StringIO()
sys.stdout = output
exec "print 1+1"
sys.stdout = sys.__stdout__
print output.getvalue()