2011-08-11 9 views
5

क्या मैं किसी भी तरह से ipython (या यहां तक ​​कि बेहतर, ipython-qtconsole) उदाहरण सकता हूं और इसके कदम (आईपीथन) मुख्य लूप मैन्युअल रूप से कदम उठा सकता है?आईपीथॉन मैनरेट मुख्य लूप मैन्युअल रूप से?

मैं फ्लाई पर पांडा 3 डी प्रोग्राम संपादित करना चाहता हूं।

EDIT1: यहां कोड नमूना है जो मुझे थोड़ा सा स्पष्ट करना चाहिए जो मैं करना चाहता हूं।

import sys 

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
from direct.showbase.ShowBase import ShowBase 

class MyApp(ShowBase): 

    def __init__(self): 
     ShowBase.__init__(self) 
     self.qtApp = QApplication(sys.argv) 
     label = QLabel("Hello World") 
     label.show() 
     self.m = loader.loadModel("frowney") 
     self.m.reparentTo(render) 

     while 1: 
      self.qtApp.processEvents() #manual step trough Qt loop 
      taskMgr.step()    #manual step trough Panda3D loop 

app = MyApp() 

तो आप देख सकते मैं स्वयं कैसे कदम कर सकते हैं गर्त पांडा और क्यूटी, मैं IPython अपनी यदि संभव हो तो साथ भी ऐसा ही करना चाहते हैं।

उत्तर पूरा फ़ाइल:

from direct.showbase.ShowBase import ShowBase 
from IPython.lib import inputhook 
class MyApp(ShowBase): 

def __init__(self): 
    ShowBase.__init__(self) 
    self.m = loader.loadModel("frowney") 
    self.m.reparentTo(render) 

def stepMe(self): 
    taskMgr.step()    #manual step trough Panda3D loop 
    return 0 
if __name__ == "__main__": 
    app = MyApp() 
    inputhook.set_inputhook(app.stepMe) 

अपने cmd लाइन में, बस निर्देशिका जहां फ़ाइल है के पास जाकर कर

  1. ipython
  2. run file.py
  3. app.m.setPos(1,1,1)

उत्तर

2

"फ्लाई पर पांडा 3 डी प्रोग्राम संपादित करें" के द्वारा, क्या आप बस अपने चल रहे कार्यक्रम का परीक्षण करने के लिए चीजों को बदलने का मतलब रखते हैं? या वास्तव में इंटरैक्टिव वातावरण में अपने कार्यक्रम की संरचना में लगातार संपादन कर रहे हैं?

एक इंटरैक्टिव पायथन सत्र में बस अपने लूप पर कदम उठाना काफी आसान है। आप while 1: को def step(self): जैसी विधि घोषणा के साथ प्रतिस्थापित कर सकते हैं, फिर प्रत्येक चरण के लिए इसे कॉल करें।

import sys 

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
from direct.showbase.ShowBase import ShowBase 

class MyApp(ShowBase): 

    def __init__(self): 
     ShowBase.__init__(self) 
     self.qtApp = QApplication(sys.argv) 
     label = QLabel("Hello World") 
     label.show() 
     self.m = loader.loadModel("frowney") 
     self.m.reparentTo(render) 

    def step(self): 
     self.qtApp.processEvents() #manual step trough Qt loop 
     taskMgr.step()    #manual step trough Panda3D loop 
     return 0     #PyOS_InputHook expects an integer 

if __name__ == "__main__": 
    app = MyApp() 
    while 1: app.step() 
मुख्य पाश के लिए if __name__ == "__main__" साथ

, आपकी फ़ाइल अभी भी रूप में यह जब स्टैंडअलोन चलाना चाहिए काम करेंगे। लेकिन अब आप इसे एक इंटरैक्टिव सत्र में आयात कर सकते हैं और चरणों के बीच चीजों को संशोधित कर सकते हैं।

>>> import myfile 
>>> app = myfile.MyApp() 
>>> app.step() 
>>> app.something = something_else 
>>> app.step() 

अब IPython के घटना पाश में जोड़ने के लिए है, इसलिए इसे के रूप में आप दुभाषिया का उपयोग करें, आप (IPython 0.11 में नया) IPython.lib.inputhook.set_inputhook() उपयोग कर सकते हैं चलाया जाएगा।

>>> from IPython.lib import inputhook 
>>> inputhook.set_inputhook(app.step) 

यह प्रोग्रामर को निष्क्रिय होने के दौरान आपके प्रोग्राम को चलाने का कारण बनना चाहिए, लेकिन फिर भी सामान्य रूप से हेरफेर की अनुमति दें।

+0

क्षमा करें, लेकिन मुझे विश्वास है कि आपने प्रश्न शीर्षक और शरीर में _I_Python को नहीं देखा है। या यदि आपने किया, तो मैं लूप के दौरान उसमें ipython.step() जैसे कुछ करना चाहता हूं। – grizwako

+1

@GrizzLy मैं कभी-कभी मानक पायथन दुभाषिया में इस विधि का उपयोग करता हूं, इसलिए मैंने सोचा कि यह आपके जैसा ही हो सकता है। Ipython के लिए, क्या आप सिर्फ IPython.lib आयात से कर सकते हैं; inputhook.set_inputhook (app.step) '? ऐसा लगता है कि यह वही करना चाहिए जो आप चाहते हैं, और एक पांडा 3 डी ऐप के लिए काम करना प्रतीत होता है, जब तक कि "कदम" रिटर्न 0 – mesilliac

+0

परेशान करने के लिए खेद है, लेकिन क्या आप निर्देश पोस्ट कर सकते हैं कि इसे कैसे प्राप्त किया जाए? कोड, और कमांड जिन्हें आप इसे चलाने के लिए उपयोग करते हैं? मैंने कोशिश की, और कोई भाग्य नहीं था .. – grizwako

1

%run -d -b40 myscript 

का उपयोग कर -b40 पैरामीटर लाइन 40 (जो पाश आप डिबग करना चाहते हैं की पहली पंक्ति होना चाहिए) पर स्क्रिप्ट में एक ब्रेकपाइंट सेट IPython डीबगर में स्क्रिप्ट चलाएँ। स्क्रिप्ट को शुरू करने के लिए प्रॉम्प्ट पर c टाइप करें जो ब्रेकपॉइंट पर रुक जाएगा। डीबगर पर सहायता प्राप्त करने के लिए h टाइप करें।

+1

हाँ, लेकिन यह मेरे खेल के निष्पादन को रोक देगा, मैं इसे निरंतर चलाना चाहता हूं। – grizwako

+1

@Grizzly आप लूप के माध्यम से कैसे कदम उठा सकते हैं और साथ ही साथ एक ही थ्रेड के भीतर सबकुछ होने पर आपके ऐप को चलाने दें? (या हो सकता है कि मैंने आपके प्रश्न को गलत समझा) – MatToufoutu

+0

@Mat कोड को देखो जो मैंने प्रश्न में पोस्ट किया है, यह उस समय है: भाग 1।हो सकता है कि मैंने पूरी तरह से कुछ गलत समझा, लेकिन स्टेपिंग ट्रफ लूप का मतलब है कि आपका एप्लिकेशन चल रहा है? – grizwako