2012-02-25 693 views

回答

4

在你MoinMoin的實例去

data/macro 

確保有一個__init__.py至少包含以下內容:

from MoinMoin.util import pysupport 

modules = pysupport.getPackageModules(__file__) 

然後創建您的宏有:

touch PyShell.py 

以此爲模板:

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

在你的維基頁面,你現在應該能夠調用宏用:

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

感謝您的回答。爲了澄清,我希望能夠做的是在編輯模式下在頁面中放置一些任意的小型python代碼,並讓一些動作/宏使用我的代碼,通過python解釋器運行它,並在頁面上顯示輸出在觀看模式下。閱讀更多的文檔,我想我應該添加一個[解析器](http://moinmo.in/HelpOnParsers)。 – mitchus 2012-02-25 12:17:13

+0

我修改了我的宏示例以適合您的需求。 – hoffmaje 2012-02-25 12:32:23

+0

這看起來不錯!它不應該是'exec'而不是'eval'嗎? – mitchus 2012-02-25 12:40:09

7

另一種方法是增加分析器。

下面是一個非常快速和骯髒的改編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>")) 

如果保存例如作爲path/to/MoinMoin/parser/interpret_python.py,那麼你就可以進入一個頁面

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

和查看網頁時,就會產生文本

1 
3 
5 

。通過將執行限制在sandbox可以使安全(r)。

相關問題