2012-07-25 14 views
5

के बाद ctypes से printf() को ctypes में प्रदर्शित करता है, मैं Windows Vista पर PyDev और Python 3.2 के साथ ग्रहण चला रहा हूं, और पायथन और ctypes पर एक ट्यूटोरियल के माध्यम से काम कर रहा था।ग्रहण और पायथन 3: बाद के प्रिंट() कथन

हालांकि, मैंने पाया कि जब मैं एक स्ट्रिंग मुद्रित करने के लिए msvcrt.printf() को कॉल करता हूं, तो यह ग्रहण के लिए कंसोल आउटपुट में प्रदर्शित नहीं होता है जब तक कि अन्य सभी प्रिंट स्टेटमेंट प्रदर्शित नहीं होते हैं।

यहाँ सटीक कोड मैं का उपयोग करें:

from ctypes import * 

msvcrt = cdll.msvcrt 
message_string = "Hello Worlds!\n" 

printf = msvcrt.printf 
print(printf("Testing: %s".encode('ascii'),message_string.encode('ascii'))) 


print("foo") 

print("why!?") 

और यहां उत्पादन होता है:

23 
foo 
why!? 
Testing: Hello Worlds! 

केवल स्पष्टीकरण मैं कहीं और (सामान्य रूप में सी के लिए) को देखा है उल्लेख कैसे printf बफ़र है और प्रदर्शित करने से पहले एक नई लाइन की आवश्यकता है, लेकिन स्ट्रिंग में एक नई लाइन है, और मैंने सीधे प्रिंटफ स्टेटमेंट ('printf ("परीक्षण:% s \ n", ...') में भी एक जोड़ा और इससे कोई फर्क नहीं पड़ता।

मैं ग्रहण में काम करना चाहता हूं, हर बार जब मैं स्क्रिप्ट का परीक्षण करना चाहता हूं, तो मैं कमांड प्रॉम्प्ट खोलना नहीं चाहता हूं, तो क्या कोई तरीका है कि मैं कंसोल आउटपुट में इस ऑर्डर को ठीक कर सकता हूं? और ऐसा क्यों होता है?

उत्तर

0

इस हालांकि आपके प्रश्न का उत्तर नहीं करता है लेकिन printf 23 जो मुद्रित अक्षरों की संख्या है लौटा रहा है, तो आप sprintf से बदलने सकता है और वह स्ट्रिंग वापस आ जाएगी और सही उम्मीद क्रम में कंसोल में प्रदर्शित किया जाएगा।

हालांकि, मुझे mscvcrt के printf का उपयोग करने का कोई कारण नहीं दिखता है जब आप पाइथन के साथ ऐसा कर सकते हैं।

+0

मैं सिर्फ ctypes पर एक ट्यूटोरियल, पीछा कर रहा था जो मैं बाद में printf के अलावा कार्यों के लिए उपयोग करने की योजना है। कारण मैं इसे समझना चाहता था और इसे काम पर लेना चाहता था क्योंकि अगर मैं समझ नहीं पा रहा हूं कि इस सरल कार्य के साथ क्या हो रहा है, तो मैं और अधिक जटिल लोगों को कैसे समझ सकता हूं? – Brian

1

यदि सी मानक लाइब्रेरी stdout किसी कंसोल की बजाय फ़ाइल या पाइप से जुड़ा हुआ है, तो यह इसके आउटपुट को अवरुद्ध कर देगा। आप इस के आसपास जारी करके काम कर सकते हैं एक fflushprintf के बाद:

msvcrt.fflush(msvcrt.stdout) 

तुम भी गैर बफ़र मोड में stdout मजबूर करने के लिए सक्षम हो सकता है:

msvcrt.setvbuf(msvcrt.stdout, None, _IONBF, 0) 
+0

स्पष्टीकरण के लिए धन्यवाद, लेकिन फिक्स के लिए, मुझे यह त्रुटि मिलती है: "विशेषता त्रुटि: फ़ंक्शन 'stdout' नहीं मिला" – Brian

+0

msvcrt से stdout के लिए पॉइंटर प्राप्त करना काफी कठिन हो सकता है; http://osdir.com/ml/python.ctypes/2005-09/msg00019.html देखें – ecatmur

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