2012-02-25 14 views
5

Tôi đã tự hỏi liệu có một mẹo để (dễ dàng) kết hợp một số mã python vào một trang moinmoin, có lẽ bằng cách thêm một số action. Ý tưởng là cái gì đó nhưCó cách nào để kết hợp mã python vào các trang moinmoin không?

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

được hiển thị trên các trang như là

1 
3 
5 

Nhanh chóng và bẩn là ok, an toàn không phải là một mối quan tâm, tôi muốn có điều này cho một độc lập, Cài đặt "desktop-mode".

Trả lời

4

Trong trường hợp MoinMoin của bạn đi đến

data/macro 

Hãy chắc chắn rằng có một __init__.py với ít nhất các nội dung sau đây:

from MoinMoin.util import pysupport 

modules = pysupport.getPackageModules(__file__) 

Sau đó tạo macro của bạn có:

touch PyShell.py 

Sử dụng mẫu này làm mẫu:

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

Trong wiki trang của bạn bây giờ bạn sẽ có thể gọi macro với:

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

Cảm ơn câu trả lời của bạn. Để làm rõ, những gì tôi muốn có thể làm là đặt một số mã python nhỏ tùy ý _in một trang trong chế độ chỉnh sửa_ và có một số hành động/macro lấy mã của tôi, chạy nó thông qua trình thông dịch python và hiển thị đầu ra _on trang trong chế độ xem_. Đọc thêm về tài liệu, tôi nghĩ tôi nên thêm [trình phân tích cú pháp] (http://moinmo.in/HelpOnParsers). – mitchus

+0

Tôi đã sửa đổi ví dụ macro của mình để phù hợp với nhu cầu của bạn. – hoffmaje

+0

Điều đó có vẻ khá tốt! Nó không phải là 'exec' hơn là' eval' mặc dù? – mitchus

7

cách tiếp cận khác là thêm một phân tích cú pháp.

Dưới đây là một sự thích ứng rất nhanh và bẩn của 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>")) 

Nếu nó được lưu ví dụ như path/to/MoinMoin/parser/interpret_python.py, sau đó bạn có thể nhập vào một trang

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

và nó sẽ tạo ra các văn bản

1 
3 
5 

khi xem trang này. Có thể được thực hiện an toàn (r) bằng cách giới hạn việc thực hiện một sandbox.

Các vấn đề liên quan