2012-02-25 11 views
5

मैं सोच रहा था कि कुछ पाइथन कोड को एक मोइनमॉइन पेज में शामिल करने के लिए एक चाल है (शायद) action जोड़कर। विचार यह है कि कुछक्या मोइनमोइन पृष्ठों में पायथन कोड को शामिल करने का कोई तरीका है?

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

,

1 
3 
5 

त्वरित और गंदे ठीक है के रूप में पृष्ठ पर प्रदर्शित होता सुरक्षा एक चिंता का विषय नहीं है मैं के लिए एक स्टैंड-अलोन इस करना चाहते हैं "desktop-mode" स्थापना।

उत्तर

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

आपके उत्तर के लिए धन्यवाद। स्पष्टीकरण के लिए, मैं क्या करने में सक्षम होना चाहता हूं, संपादन मोड में एक पृष्ठ में कुछ मनमानी छोटे पायथन कोड _ डाल दिया गया है, और कुछ क्रिया/मैक्रो मेरा कोड लेते हैं, इसे पायथन दुभाषिया के माध्यम से चलाते हैं, और पृष्ठ को आउटपुट प्रदर्शित करते हैं देखने में मोड_। प्रलेखन में और पढ़ना, मुझे लगता है कि मुझे एक [पार्सर] (http://moinmo.in/HelpOnParsers) जोड़ना चाहिए। – mitchus

+0

मैंने आपकी जरूरतों को पूरा करने के लिए अपने मैक्रो उदाहरण को संशोधित किया। – hoffmaje

+0

यह बहुत अच्छा लग रहा है! हालांकि यह 'eval' के बजाय' exec' नहीं होना चाहिए? – mitchus

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 पर सीमित करके सुरक्षित (आर) बनाया जा सकता है।

संबंधित मुद्दे