2012-02-25 7 views

Odpowiedz

4

W swojej MoinMoin przykład pójść do

data/macro 

Upewnij się, że nie jest __init__.py przynajmniej następującej treści:

from MoinMoin.util import pysupport 

modules = pysupport.getPackageModules(__file__) 

następnie utwórz makro tam:

touch PyShell.py 

Użyj tego jako szablonu:

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()) 

W swoich stronach wiki powinien teraz być w stanie wywołać tego makra z:

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

Dzięki za odpowiedź. Aby wyjaśnić, co chciałbym móc zrobić, należy umieścić dowolny niewielki mały kod Pythona na stronie w trybie edycji_, a niektóre akcje/makra biorą mój kod, uruchamiają go przez interpreter python i wyświetlają wyjście _na stronie w trybie przeglądania_. Czytając więcej w dokumentacji, myślę, że powinienem dodać [parser] (http://moinmo.in/HelpOnParsers). – mitchus

+0

Zmodyfikowałem mój przykład makra, aby dopasować go do twoich potrzeb. – hoffmaje

+0

To wygląda całkiem nieźle! Czy nie powinno to być 'exec', a nie' eval'? – mitchus

7

Innym podejściem jest dodanie parser.

Poniżej znajduje się bardzo szybka i brudna adaptacja 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>")) 

Jeśli jest zapisywany na przykład jako path/to/MoinMoin/parser/interpret_python.py, można zawrzeć stronie

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

i będzie produkować tekst

1 
3 
5 

podczas przeglądania strony. Można go uczynić bezpiecznym (r), ograniczając wykonanie do sandbox.

Powiązane problemy