2009-05-01 21 views
11

के अंदर एक पायथन खोल को एम्बेड करना मैं पाइथन में एक विज्ञान प्रयोगशाला बना रहा हूं, जिसमें उपयोगकर्ता सभी प्रकार की वस्तुओं को बना, संशोधित और विश्लेषण कर सकता है। मैं प्रोग्राम के अंदर एक पाइथन खोल रखना चाहता हूं, इसलिए उपयोगकर्ता शेल के माध्यम से ऑब्जेक्ट्स में हेरफेर कर सकता है। (नोट: उन्होंने यह भी सामान्य जीयूआई के माध्यम से वस्तुओं में हेरफेर कर सकते हैं।)पायथन प्रोग्राम

एक mockup है कि इस दिखाता है: http://cool-rr.com/physicsthing/physicsthing_mockup_thumb.gif

मैं बात की इस तरह कैसे बना सकते हैं?

मैंने eval का उपयोग करने पर विचार किया, लेकिन मुझे लगता है कि evalimport को संभाल नहीं सकता है।

उत्तर

10

अपने जीयूआई ढांचे पर निर्भर करता है, यह पहले से ही किया हो सकता है किया गया है:

  • wxPython के लिए, "PyCrust" देखो - यह अपने अनुप्रयोग
  • PyQt के लिए, pyqtshell (अद्यतन में एम्बेड करने के लिए बहुत आसान है 2011/04/29:

    :
    इन दिनों spyder कहा जाता है)

यहाँ है कि मैं क्या आवेदन में PyCrust एम्बेड करने के लिए किया था है

import wx.py.crust 
... 
... 
# then call 

crustFrame = wx.py.crust.CrustFrame(parent = self) 
crustFrame.Show() 

self यहां मेरे मुख्य फ्रेम को संदर्भित करता है (wx.Frame से लिया गया)। यह एक प्यक्रस्ट विंडो बनाता है जो आपके एप्लिकेशन में चलता है और आपको अपने मुख्य फ्रेम में संग्रहीत सब कुछ का निरीक्षण करने की अनुमति देता है (self की वजह से)।

+0

मैंने पायक्रस्ट देखा, लेकिन मुझे समझ में नहीं आया- क्या यह पाइथन का एक और उदाहरण बनाता है?मुझे ऐसा कुछ चाहिए जो पाइथन के उसी उदाहरण को नियंत्रित करेगा जो मुख्य प्रोग्राम चलता है। –

+0

जोड़ा गया कोड नमूना। यह एक ही उदाहरण में चलता है, और उस ऑब्जेक्ट को एक्सेस (और संशोधित) कर सकता है जिसे इसे माता-पिता के रूप में दिया जाता है। –

+0

धन्यवाद, बहुत अच्छा काम किया! –

3

पायथन eval() फ़ंक्शन केवल अभिव्यक्तियों को संभालता है। आप इसके बजाय exec कथन पर विचार करना चाह सकते हैं, जो किसी भी मनमानी पायथन कोड को चला सकता है।

15

आप code - Interpreter base classes, विशेष रूप से code.interact() की तलाश में हैं।

कुछ examples from effbot

+0

वे उदाहरण पायथन 1.5 से हैं ... –

+0

ठीक है, दस्तावेज़ों का लिंक 2.6 है और आपको केवल कोड code.interact() कॉल करना है। एक और उदाहरण के लिए, यहां Django शेल कमांड का एक लिंक है जो वर्तमान दोनों है और आयरनपीथन के साथ भी काम करता है: http://code.djangoproject.com/browser/django/trunk/django/core/management/commands/shell.py –

+0

.. यह सिर्फ दुभाषिया को एम्बेड करने की आवश्यकता वाले अन्य लोगों के संदर्भ के लिए है। यदि आप wxPython का उपयोग कर रहे हैं तो PyCrust निश्चित रूप से एक बेहतर समाधान है। –

3

एफडब्ल्यूआईडब्ल्यू, मेरा मानना ​​है कि एनथॉट ने अपने पायथन-आधारित (और न्यूपी-आधारित) विज़ुअलाइजेशन सूट के उपयोग के लिए ऐसा कुछ लिखा है। मैंने दो साल पहले एक डेमो देखा जहां वे वास्तव में आपको सीधे जीयूआई या पायथन दुभाषिया के माध्यम से वस्तुओं का उपयोग करने देते हैं।

इसके अलावा, पहले उत्तर में जोड़ने के लिए, आपको कोड को उपclass करना पड़ सकता है। इंटरएक्टिव कंसोल self.read() और self.write() को ओवरराइड करने के लिए, इसलिए वे जीयूआई के साथ बातचीत करते हैं। और आपको sys.stdout और sys.stderr को कुछ लिखने योग्य वर्ग पर रीडायरेक्ट करना होगा जो एक ही कंसोल पर लिखता है।

+0

इससे पहले कि मैं आपके उत्तर को पचाना शुरू कर दूं- क्या आप किसी भी मौके से, Guido होने के लिए होता है? –

0

मैं एक शेल के रूप में pdb.set_trace() का उपयोग करता हूं। इसमें कुछ डिबगिंग क्षमताएं भी हैं :)

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