पर सीटीपीएस के माध्यम से एक सी लाइब्रेरी फ़ंक्शन में फ़ाइल डिस्क्रिप्टर पास करने के लिए मैं सीटीपीएस के माध्यम से एक फ़ाइल डिस्क्रिप्टर पास करने की कोशिश कर रहा हूं, सी समारोह में जहां एफडी पर लिखते हैं। लिनक्स पर यह काम करता है। खिड़कियों पर ऐसा नहीं होता है और मुझे समझ नहीं आता क्यों (मैं खिड़कियों पर एक डेवलपर के रूप कोई अनुभव नहीं है)विंडोज
//C func signature:
void fun(struct bah *opaque, int fd)
अजगर से (विवरण ommited) है:
mylib.fun.argtypes = [POINTER(bah), c_int]
fh = open(filename,'wb')
#doesn't work on windows, works on linux/unix
mylib.fun(some_ctypes_struct, fh.fileno())
#doesn't work on windows
mylib.fun(bah_struct, ctypes.cdll.msvcrt._open(filename,_O_FLAGS_MASK, ACCMASK)
#doesn't work
mylib.fun(bah_struct, os.open(...))
कार्यक्रम लिखने पर मर जाता है () रों एक असफल अभिकथन _osfile साथ (एफ एच) & fopen
cl.exe: x86 के लिए 16.00.40219.01 अजगर 2.7.2 एमएससी v.1500 32 बिट
हो क्या मुझे यह करना है? नहीं, मैं lib को ओपन() को ऑफ़लोड नहीं करना चाहता हूं। मैं पहले से ही एक खुले फ़ाइल डिस्क्रिप्टर को एक सुरक्षित तरीके से प्लेटफॉर्म स्वतंत्र करना चाहता हूं।
में अतिरिक्त जानकारी के लिए, बस के मामले में: पुस्तकालय tinycdb है, मैं इसे जल्दी से खिड़कियों के लिए एक छोटी cmake कल्पना और कुछ गंदे धब्बे के साथ getopt और dll निर्यात काम करने के लिए भेजा। पुस्तकालय और exe उपकरण अपेक्षित (परीक्षण) के रूप में काम करता है। tinycdb के लिए पायथन ctypes wrappers के रूप में लिनक्स पर काम करता है। खिड़कियां मुझे आँखों देता है। वह स्वीकार नहीं करेगा कि एफडी एक वैध वर्णनकर्ता है, भले ही मैं इसे अपने स्वयं के (एमएसवीसीआरटी) _open libcall के साथ खोलने के बाद इसे पास कर रहा हूं।
बेशक, सब कुछ काम करता है अगर मैं() आईएनजी/बंद() पुस्तकालय के भीतर फ़ाइल ing खुला रहा हूँ, लेकिन मैं एपीआई बदलने के लिए खर्च नहीं उठा सकते।
क्या सी सी लाइब्रेरी (msvcrt) दोनों पायथन और आपके डीएलएल द्वारा उपयोग किया जा रहा है? (http://www.dependencywalker.com/ जांचने का एक तरीका है।) – jdigital