2010-06-28 14 views
5

मुझे आशा है कि यह मामूली है और मुझे इसे ट्यूटोरियल्स में नहीं मिला। मैं अजगर कोड लिख रहा हूं जो 'पर्यवेक्षण' सी कोड है, उर्फ ​​मैं सी कोड को पायथन से सीटीपीएस चलाता हूं। अब मैं सी कोड द्वारा आउटपुट डेटा को संसाधित करने के लिए सी 'printfs' को पकड़ना चाहता हूं। कोई विचार यह कैसे करेगा?ctypes के साथ पायथन में 'print' c printf कैसे करें?

धन्यवाद

+0

क्या आप पाइथन में सी printf को अधिभारित करना चाहते हैं? – luc

+0

अगर ओवरलोडिंग, ओएस पर क्या? – Arlaharen

+0

अगर ओवरलोडिंग मेरी समस्या का समाधान करेगी, तो मैं कोशिश करूंगा। मैं उबंटू 9 .10 का उपयोग करता हूं। – Framester

उत्तर

0

खैर printf बस इसके उत्पादन लिखते हैं जो कुछ भी करने के लिए stdout फ़ाइल सूचक को दर्शाता है। मुझे यकीन नहीं है कि आप सी प्रोग्राम को कैसे निष्पादित कर रहे हैं, लेकिन सी प्रोग्राम के stdout को उस पायदान में पढ़ा जा सकता है जिसे आप पाइथन में पढ़ सकते हैं।

2

आप अपने C कोड से लिखे जाने से पहले stdout को अवरुद्ध कर सकते हैं, फिर आउटपुट मान को संसाधित करें।

import sys 
import StringIO 

buffer = StringIO.StringIO() 

# redirect stdout to a buffer 
sys.stdout = buffer 

# call the c code with ctypes 
# process the buffer 

# recover the old stdout 
sys.stdout = sys.__stdout__ 

हालांकि, यह सी कोड के लिए एक बफर पारित करने के लिए आसान है और अच्छे होगा, और के बजाय printf उत्पादन मूल्यों आईएनजी आप उन्हें प्रदान की बफर में लिखेंगे।

या, बेहतर अभी तक, आप byref एक c_char_p गुजारें सकता, C कोड के अंदर इसके लिए स्मृति को आबंटित, उत्पादन मूल्य के साथ बफर अद्यतन तो Python में बफर का उपयोग करें। स्मृति को डिलीकेट करने के लिए मत भूलना (आपको free फ़ंक्शन के लिए ctypes रैपर बनाना चाहिए)।

+0

'stdout' की हस्तक्षेप जो मैंने दिमाग में रखी थी। लेकिन यह मेरे लिए काम नहीं करता है। कोड आउटपुट व्यवहार नहीं बदलता है। – Framester

+0

मैं वास्तव में समझ नहीं पा रहा हूं कि आपका मतलब क्या है * कोड आउटपुट व्यवहार को नहीं बदलता *। आप जो हासिल करने की कोशिश कर रहे हैं और 'stdout' पुनर्निर्देशन के साथ आने वाली समस्याओं का एक और विस्तृत विवरण प्रदान करना हमें इस बात का संकेत दे सकता है कि हम आपकी मदद कैसे कर सकते हैं। –

+0

खुद को पर्याप्त स्पष्ट नहीं करने के लिए खेद है। मैंने 'stdout' को रोकने के लिए कोड की रेखाएं जोड़ दीं, लेकिन पाइथन में ctypes के साथ कॉल किए गए सी कार्यों के 'printfs' को अभी भी टर्मिनल में आउटपुट किया गया है। मैं जवाब में अपनी समस्या का एक और ठोस विवरण जोड़ दूंगा। – Framester

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