有没有办法将python代码合并到moinmoin页面?

时间:2012-02-25 11:16:55

标签: python moinmoin

我想知道是否有一个技巧(轻松)将一些python代码合并到moinmoin页面中,可能通过添加一些action。这个想法是像

这样的东西
<<<
for j in [1,3,5]:
   print(i)
>>>

在页面上显示为

1
3
5

快速和肮脏是可以的,安全性不是问题,我希望将其用于独立的“desktop-mode”安装。

2 个答案:

答案 0 :(得分: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)。

答案 1 :(得分: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())

在您的wiki页面中,您现在应该可以使用以下命令调用该宏:

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