2011-12-05 10 views
22

वहाँ प्रिंट कॉल करने से एक समारोह को रोकने के लिए एक रास्ता है। या, अधिक आम तौर पर, एक फ़ंक्शन कॉल करने का तरीका और किसी विशेष फ़ंक्शन कॉल को छोड़कर इसे अपने सभी कोड चलाते हैं?दबाने (अजगर) मुद्रित करने के लिए कहता है

मेरे ठोस मामला: मैं एक खेल मैं पर काम कर रहा हूँ के लिए pygame.joystick मॉड्यूल का उपयोग कर रहा हूँ।

मैं एक pygame.joystick.Joystick वस्तु बनाया है और खेल की वास्तविक पाश में उपयोगकर्ता इनपुट के लिए जाँच करने के लिए अपने सदस्य समारोह get_button कहते हैं। समारोह सब कुछ मैं यह सब करने की ज़रूरत है, लेकिन समस्या यह भी print कॉल, जो खेल में काफी धीमा है। कोई सलाह?

धन्यवाद और मेरे सवाल का भी भ्रमित करने वाले नहीं कहा गया था उम्मीद!

उत्तर

5

नहीं, नहीं है, विशेष रूप से pygame कि अधिकांश सी

में लिखा है लेकिन इस समारोह प्रिंट कॉल करता है, तो, तो यह pygame बग है, और तुम सिर्फ यह रिपोर्ट करना चाहिए।

2

मुझे एक ही समस्या है, और मैं प्रोग्राम के आउटपुट को रीडायरेक्ट करने के लिए नहीं आया था (मुझे नहीं पता कि स्पैमिंग स्टडआउट या स्टडर पर स्पैमिंग होता है) /dev/null निर्वाण में।

दरअसल, यह खुला स्रोत है, लेकिन मैं pygame स्रोतों - और निर्माण प्रक्रिया में गोता लगाने के लिए पर्याप्त भावुक नहीं था - किसी भी तरह से डीबग स्पैम को रोकने के लिए।

संपादित करें:

pygame.joystick module सभी कार्यों कि अजगर को वास्तविक मान में printf के लिए कॉल किया है:

printf("SDL_JoystickGetButton value:%d:\n", value); 

दुर्भाग्य से आप इन बाहर टिप्पणी और पूरी बात पुन: संयोजित करने की आवश्यकता होगी। हो सकता है कि प्रदत्त setup.py मैंने सोचा जितना आसान हो जाएगा। आप इसे आजमा सकते हैं ...

29

पायथन आपको किसी भी फ़ाइल ऑब्जेक्ट के साथ मानक आउटपुट (stdout) को ओवरराइट करने देता है। यह क्रॉस प्लेटफार्म काम करना चाहिए और शून्य डिवाइस को लिखना चाहिए।

import sys, os 

# Disable 
def blockPrint(): 
    sys.stdout = open(os.devnull, 'w') 

# Restore 
def enablePrint(): 
    sys.stdout = sys.__stdout__ 


print 'This will print' 

blockPrint() 
print "This won't" 

enablePrint() 
print "This will too" 

आप एक समारोह, प्रिंट यह पहले blockPrint(), और enablePrint() फोन जब आप इसे जारी रखना चाहते हैं के लिए है कि नहीं करना चाहते हैं। आप निष्क्रिय करने के लिए सभी मुद्रण चाहते हैं, फ़ाइल के शीर्ष पर अवरुद्ध शुरू करते हैं।

+0

यह स्थायी रूप से मेरे लिए प्रिंट अवरुद्ध है लगता है। enablePrint इसे पुनर्स्थापित नहीं करता –

1

एक पूरी तरह से अलग दृष्टिकोण आदेश पंक्ति पर पुनः निर्देशित किया जाएगा। यदि आप विंडोज़ पर हैं, तो इसका मतलब है बैच स्क्रिप्ट। लिनक्स पर, बैश।

/full/path/to/my/game/game.py > /dev/null 
C:\Full\Path\To\My\Game.exe > nul 

जब तक आप कई प्रक्रियाओं के साथ काम कर रहे हैं, इस चाहिए काम करते हैं। विंडोज उपयोगकर्ताओं के लिए यह आपके द्वारा बनाए जा रहे शॉर्टकट हो सकते हैं (मेनू/डेस्कटॉप प्रारंभ करें)।

0

मॉड्यूल मैंने stderr पर मुद्रित किया था।तो उस मामले में समाधान होगा:

sys.stdout = open(os.devnull, 'w') 
13

@FakeRainBrigand समाधान मैं एक सुरक्षित समाधान का सुझाव दे रहा हूँ के आधार पर:

import os, sys 

class HiddenPrints: 
    def __enter__(self): 
     self._original_stdout = sys.stdout 
     sys.stdout = None 

    def __exit__(self, exc_type, exc_val, exc_tb): 
     sys.stdout = self._original_stdout 

तो फिर तुम इसे इस तरह उपयोग कर सकते हैं:

with HiddenPrints(): 
    print("This will not be printed") 

print("This will be printed as before") 

यह अधिक सुरक्षित है क्योंकि आप stdout को फिर से सक्षम करना नहीं भूल सकते हैं, जो अपवादों को संभालने में विशेष रूप से महत्वपूर्ण है।

try: 
    disable_prints() 
    something_throwing() 
    # enable_prints() This wouldn't be enough! 
except ValueError: 
    handle_error() 
finally: 
    enable_prints() # That's where it needs to go. 

आप अपने print कॉल की finally खंड, कोई भी भूल गए हैं तो अब और कुछ भी प्रिंट होगा। with कथन का उपयोग करके, ऐसा नहीं हो सकता है।

जैसा कि @ वेलडोन 20 9 4 द्वारा नोट किया गया है, sys.stdout = None असाइन करना संभव है। जो कोड को और स्पष्ट करता है। यह written कि sys.stdout एक FileObject होना चाहिए, लेकिन वहाँ है एक और note:

कुछ शर्तें stdin, stdout और stderr के साथ ही मूल मूल्यों stdin, stdout और stderr कर सकते हैं के तहत कोई नहीं बनो यह आमतौर पर pythonw के साथ शुरू किया विंडोज जीयूआई क्षुधा है कि एक सांत्वना और अजगर क्षुधा से जुड़े नहीं हैं के लिए मामला है।

+2

बहुत अच्छा समाधान! मैं तो बस एक ही बात लिखा था और फिर आप पहले से ही पाया कि जिस तरह से उत्तर दिया: डी के बारे में मैं क्यों इस यह करने के लिए एक बेहतर तरीका है के बारे में जानकारी का एक सा जोड़ देंगे। – iFreilicht

+0

नोबई प्रश्न यहां प्रश्न: कक्षा से बाहर निकलने के बाद बंद करना महत्वपूर्ण होगा? – Wadsworth

+0

@Wadsworth, मुझे जवाब नहीं पता। मुझे लगता है कि देवन के गुणों को इसे ठीक से बंद करने की आवश्यकता नहीं है। लेकिन अफवाहें कहती हैं कि संसाधनों को जारी करने के लिए आपको हमेशा खुले हैंडलर बंद करना चाहिए। जैसा कि मुझे पता है कि सीपीथॉन को खुद को बर्बाद कर लेना चाहिए, जहां तक ​​कचरा कलेक्टर इसे प्राप्त कर लेता है। –

0

stdout रीडायरेक्ट कर रहा है (फ़ाइल उद्देश्य यह है कि print उपयोग करता है) भी contextlib.redirect_stdout के साथ पूरा किया जा सकता है। इसके अतिरिक्त, आप stderrcontextlib.redirect_stderr के साथ रीडायरेक्ट कर सकते हैं।

import os 
import contextlib 

with open(os.devnull, "w") as f, contextlib.redirect_stdout(f): 
     print("This won't be printed.") 
संबंधित मुद्दे