2012-09-19 10 views
7

पर संभव डुप्लिकेट select.select में sys.stdin का उपयोग करना:
Can select() be used with files in Python under Windows?विंडोज

UNIX पर मैं अजगर में select.select को sys.stdin पारित करने में सक्षम हूँ। मैं विंडोज़ पर ऐसा करने का प्रयास कर रहा हूं, लेकिन विंडोज़ पर पायथन में select.select इसे अनुमति नहीं देगा।

मैं जो कर रहा हूं उसका अधिक सटीक वर्णन करने के लिए https://github.com/eldarion/gondor-client/blob/ccbbf9d4b61ecbc2f66f510b993eb5fba0d81c09/gondor/run.py देखें।

unix_run_poll फ़ंक्शन वह है जिसे मैं विंडोज़ पर पूरा करने की कोशिश कर रहा हूं। मूल विचार यह है कि मेरे पास एक सर्वर से सॉकेट कनेक्शन है जिसने स्ट्रीमिंग स्टडीन, स्टडआउट, स्टेडर को दूरस्थ रूप से चल रही प्रक्रिया में जोड़ दिया है और मैं स्थानीय क्लाइंट से इसके साथ बातचीत कर रहा हूं और ऐसा लगता हूं कि स्थानीय क्लाइंट चल रहा है प्रक्रिया।

win32_run_poll विंडोज़ को पोर्ट करने का मेरा प्रयास है और यह काम करता है। यह थोड़ा गड़बड़ है और दृष्टिकोण, आईएमओ, बहुत बुरा है।

क्या किसी के पास सुझाव है कि इसे कैसे सुधार किया जा सकता है? Win32api पर निर्भरता आदर्श से कम है, लेकिन मैं इसे रखने के साथ ठीक हूँ।

+1

क्या आपने ईवेंट लूप कार्यान्वयन के लिए समर्पित पुस्तकालयों/ढांचे को देखा है? उदाहरण के लिए, [मुड़] [http://twistedmatrix.com/trac/) में [Win32 रिएक्टर] के दो कार्यान्वयन हैं (http://twistedmatrix.com/documents/current/core/howto/choosing-reactor.html# win32_wfmo)। – user4815162342

+0

मजेदार आप इसका जिक्र करते हैं। मैं अभी यह कर रहा था। :-) –

+0

एक और संभावना है कि वास्तव में स्क्रिप्ट के stdin/stdout के रूप में इसे लपेटने के बजाय, अपनी स्क्रिप्ट को सॉकेट दें, और फिर आप केवल select.select का उपयोग कर सकते हैं। – abarnert

उत्तर

7

विंडोज select पर केवल सॉकेट के लिए परिभाषित किया गया है, और मनमाने ढंग से फ़ाइल हैंडल के लिए काम नहीं करेगा (विंडोज़ में फाइल डिस्क्रिप्टर की कोई अवधारणा नहीं है)। इस समस्या के बारे में अधिक जानकारी के लिए, the msdn documentation देखें, यह चयनित मॉड्यूल के लिए python documentation में भी उल्लेख किया गया है।

यदि आप आर्बिटरी फाइलों के लिए मतदान का उपयोग करना चाहते हैं, तो आपको कुछ ऐसा देखना चाहिए जो मतदान सॉकेट और फ़ाइल हैंडल को सारणीबद्ध करता है। यह आपके पोस्ट पर एक टिप्पणी में उल्लिखित मोड़ रिएक्टर हो सकता है, या यह libuv, या आपकी पसंद की कुछ अन्य घटना लाइब्रेरी के लिए बाध्यकारी पाइथन हो सकता है।

+1

एक और विकल्प ['WaitForMultipleObjects'] को कॉल करना होगा (http: // msdn .microsoft.com/en-us/लाइब्रेरी/विंडोज़/डेस्कटॉप/ms687025% 28v = vs.85% 29.aspx) [pywin32] के माध्यम से (http://starship.python.net/crew/mhammond/win32/Downloads। एचटीएमएल)। –

+1

यह काफी सटीक नहीं है। पायथन दस्तावेज कहता है "विंडोज़ पर, अंतर्निहित चयन() फ़ंक्शन WinSock लाइब्रेरी द्वारा प्रदान किया जाता है, और फ़ाइल डिस्क्रिप्टर को संभाल नहीं करता है जो WinSock से उत्पन्न नहीं होता है।" यह भी सटीक नहीं है। जैसा कि आप कहते हैं, विंडोज़ में फाइल डिस्क्रिप्टर की कोई अवधारणा नहीं है- लेकिन सी लाइब्रेरी (एमएसवीसीआरटी) करता है, और WinSock लाइब्रेरी भी करता है। समस्या यह है कि वे एक ही अवधारणा नहीं हैं।(चीजों को और भी मजेदार बनाने के लिए, विनसॉक के आधुनिक संस्करण वास्तव में फ़ाइल डिस्क्रिप्टर का चयन नहीं करते हैं; एक fd_set वास्तव में हैंडल की एक सरणी है ...) – abarnert

+0

ऐसा लगता है जैसे WaitForMultipleObjects/WaitForSingleObject फ़ाइल हैंडल के लिए अपरिभाषित है, लेकिन इनका उपयोग किया जा सकता है कंसोल इनपुट। Http://msdn.microsoft.com/en-us/library/windows/desktop/ms687025(v=vs.85).aspx देखें। – dnaq