2013-01-11 15 views
6
में ctypes का उपयोग कर के लिए कॉल में व्यवधान नहीं डालता

जब एक पाश एक सी साझा-पुस्तकालय (गतिशील पुस्तकालय), अजगर एक KeyboardInterrupt प्राप्त नहीं होगा, और कुछ भी नहीं जवाब देंगे में प्रदर्शन किया जा रहा है बुला (या संभाल) CTRL + सी।CTRL + C साझा-पुस्तकालय अजगर

मैं क्या करूँ?

उत्तर

3

जब तक आप PyDLL या PYFUNCTYPE का उपयोग करें; जीआईएल को सीटीपीएस कॉल के दौरान जारी किया गया है। इसलिए पाइथन दुभाषिया को मुख्य थ्रेड में KeyboardInterrupt उठाकर SIGINT को संभालना चाहिए यदि सी कोड अपना सिग्नल हैंडलर इंस्टॉल नहीं करता है।

अजगर कोड मुख्य थ्रेड में चलाने की अनुमति देने; डाल सकता है ctypes एक पृष्ठभूमि धागा में फोन:

import threading 

t = threading.Thread(target=ctypes_call, args=[arg1, arg2, ...]) 
t.daemon = True 
t.start() 
while t.is_alive(): # wait for the thread to exit 
    t.join(.1) 
+0

जीआईएल! बेशक। धन्यवाद, जेएफ। यह आपको अपने लिए लेने के बजाय जवाब देने लायक है। –

1

आप SIGINT के लिए एक संकेत हैंडलर, सी, जो है, उम्मीद है कि, अपनी परियोजना के भीतर घोषित करने के लिए होगा।

+0

साझा वस्तुओं में SIGINT के साथ मेरा अनुभव है कि एक हैंडलर जरूरत है। संकेतों को अवरुद्ध करने के लिए पर्याप्त नहीं है और सिगवाइट का उपयोग करके थ्रेड प्रतीक्षा कर रहा है। –

1

मैं एक लड़ी समाधान का इस्तेमाल किया है, लेकिन फिर एक संकेत एक करने लगे। काम के आसपास मैं उपयोग करते हैं, SIGINT हैंडलर से SIGTERM भेजने के लिए है जैसे:

signal.signal(signal.SIGINT, lambda s, f : os.kill(os.getpid(), signal.SIGTERM)) 

यहाँ मैं सिर्फ समाधान के मूल विचार को बचाने के लिए यह तेजी से अगली बार और कारण पता लगाना चाहते हैं कि मैं क्यों बदल गया है दृष्टिकोण। थ्रेडेड वेरिएंट मेरे लिए सूट नहीं करता है क्योंकि ओपनएमपी मुख्य थ्रेड से नहीं कहा जाता है जब ओपनएमपी काफी धीमा हो जाता है।

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