2012-02-25 6 views

risposta

4

nell'istanza MoinMoin vai a

data/macro 

Assicurarsi che ci sia un __init__.py con almeno il seguente contenuto:

from MoinMoin.util import pysupport 

modules = pysupport.getPackageModules(__file__) 

Quindi creare la macro c'è:

touch PyShell.py 

Usa questo come modello:

import StringIO 
import sys 

def macro_PyShell(macro, code): 
    code_out = StringIO.StringIO() 
    sys.stdout = code_out 
    exec code.strip("'").strip('"') 
    sys.stdout = sys.__stdout__ 
    return macro.request.formatter.text(code_out.getvalue()) 

Nelle vostre wiki-pagine si dovrebbe ora essere in grado di chiamare la macro con:

<<PyShell("for i in [1,2,3]:\n print i")>> 
+0

Grazie per la risposta. Per chiarire, ciò che vorrei essere in grado di fare è mettere un piccolo codice python arbitrario _in una pagina in modalità di modifica_, e avere qualche azione/macro prendere il mio codice, eseguirlo attraverso l'interprete python e visualizzare l'output _nella pagina in modalità di visualizzazione_. Leggendo di più nella documentazione, penso che dovrei aggiungere un [parser] (http://moinmo.in/HelpOnParsers). – mitchus

+0

Ho modificato il mio esempio macro per soddisfare le tue esigenze. – hoffmaje

+0

Sembra abbastanza buono! Non dovrebbe però essere 'exec' piuttosto che' eval'? – mitchus

7

Un altro approccio è quello di aggiungere un parser.

Di seguito è riportato un adattamento molto veloce e sporco di Moinmoin's Hello World parser.

import StringIO 
import sys 

class Parser():   

    def __init__(self, raw, request, **kw): 
     self.raw = raw 
     self.request = request 
     self.kw=kw 

    def format(self, formatter):  
     # Execute the code 
     code_out = StringIO.StringIO() 
     sys.stdout = code_out 
     exec self.raw 
     sys.stdout = sys.__stdout__ 
     out_lines = code_out.getvalue().split("\n") 

     # Print the output 
     for out_line in out_lines: 
      self.request.write(formatter.rawHTML(out_line+"<br>")) 

se è stato salvato per esempio come path/to/MoinMoin/parser/interpret_python.py, allora si può entrare in una pagina

{{{#!interpret_python 
for j in [1,3,5]: 
    print(j) 
}}} 

e produrrà il testo

1 
3 
5 

durante la visualizzazione della pagina. Può essere reso sicuro (r) limitando l'esecuzione a sandbox.

Problemi correlati