【问题标题】:Is there a way to incorporate python code into moinmoin pages?有没有办法将 python 代码合并到 moinmoin 页面中?
【发布时间】:2012-02-25 11:16:54
【问题描述】:

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

<<<
for j in [1,3,5]:
   print(i)
>>>

在页面上显示为

1
3
5

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

【问题讨论】:

    标签: python moinmoin


    【解决方案1】:

    另一种方法是添加解析器。

    下面是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)。

    【讨论】:

      【解决方案2】:

      在你的 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")>>
      

      【讨论】:

      • 感谢您的回答。澄清一下,我想做的是把一些任意的小python代码在编辑模式下的页面中,并让一些动作/宏获取我的代码,通过python解释器运行它,并在页面上以查看模式显示输出。阅读更多文档,我想我应该添加一个parser
      • 我修改了我的宏示例以满足您的需求。
      • 看起来不错!不应该是exec 而不是eval 吗?
      • 是的,你是对的!在你提到之前我编辑了它:D
      • 我试过了;将&lt;&lt;PyShell("for i in [1,2,3]:\n print i")&gt;&gt; 插入页面确实会调用代码,但是会出现错误。 moinmoin 日志说:return macro.request.formatter.text(exec(code)) "SyntaxError: invalid syntax"
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 2022-10-01
      相关资源
      最近更新 更多