2010-01-27 6 views
35

विंडोज पर पायथन-अनुप्रयोग चल के बीच और अन्य OSes पर अंतर करने के लिए हमेशा की तरह की जांच (लिनक्स आम तौर पर) सशर्त उपयोग करने के लिए है:क्या 64-बिट पायथन पर sys.platform == 'win32' जांच का उपयोग सुरक्षित है?

if sys.platform == 'win32': 
    ... 

लेकिन मुझे आश्चर्य है कि यह सुरक्षित आज का उपयोग करने के लिए जब 64-बिट अजगर अधिक है पिछले वर्षों में व्यापक रूप से उपयोग किया जाता है? क्या 32 वास्तव में 32-बिट का मतलब है, या मूल रूप से यह Win32 API को संदर्भित करता है?

यदि एक दिन sys.platform 'win64' के रूप में होने की संभावना है तो शायद ऐसी स्थिति अधिक सार्वभौमिक होगी?

if sys.platform.startswith('win'): 
    ... 

वहाँ भी विंडोज पता लगाने के लिए एक और तरीका है मैं के बारे में पता कर रहा हूँ है:

if os.name == 'nt': 
    ... 

लेकिन मैं वास्तव में अन्य कोड में बाद के उपयोग नहीं देखा।

तब सबसे अच्छा तरीका क्या है?

यूपीडी: यदि मैं कर सकता हूं तो अतिरिक्त पुस्तकालयों का उपयोग करने से बचना चाहूंगा। यह जांचने के लिए अतिरिक्त लाइब्रेरी स्थापित करने की आवश्यकता है कि मैं विंडोज़ में काम नहीं कर रहा हूं, लिनक्स उपयोगकर्ताओं के लिए परेशान हो सकता है।

+1

यह एक बहुत अच्छा सवाल है। धन्यवाद। – jathanism

उत्तर

29

sys.platform अंतर्निहित विंडोज सिस्टम की bitness की परवाह किए बिना win32 हो जाएगा, जैसा कि आप PC/pyconfig.h में देख सकते हैं (अजगर 2.6 स्रोत वितरण से):

#if defined(MS_WIN64) 
/* maintain "win32" sys.platform for backward compatibility of Python code, 
    the Win64 API should be close enough to the Win32 API to make this 
    preferable */ 
#  define PLATFORM "win32" 

यह original patch है कि इस पर शुरू खोजने के लिए संभव है वेब, जो थोड़ा और स्पष्टीकरण प्रदान करता है:

मुख्य प्रश्न यह है: Win64 जितना अधिक Win32 की तरह है उससे अलग है कि आम मामला सामान्य पायथन प्रोग्रामर पूर्व संध्या नहीं होना चाहिए आर को अपने पायथन कोड में भेदभाव करना है। या, कम से कम, इतना है कि पाइथन ग्रंथक द्वारा इस तरह की भिन्नता पर्याप्त दुर्लभ है कि कुछ अन्य प्रदान की गई तंत्र पर्याप्त है (यहां तक ​​कि बेहतर)। वर्तमान में जवाब हाँ है। उम्मीद है कि एमएस इस जवाब को नहीं बदलेगा।

+1

धन्यवाद, यही मुझे चाहिए। – bialix

+0

आपका स्वागत है! –

1

विंडोज/32 और विंडोज/64 के लिए चेतावनी समान हैं, इसलिए उन्हें एक ही मूल्य का उपयोग करना चाहिए। एकमात्र अंतर उदाहरण में होगा sys.maxint और ctypes। यदि आपको 32 और 64 के बीच अंतर करने की आवश्यकता है तो platform आपकी सर्वश्रेष्ठ शर्त है।

+0

मुझे आपका जवाब काफी नहीं मिला है। क्या आप कहते हैं कि 64-बिट पायथन sys.platform में 'win32' का उपयोग कर निर्माण करते हैं? मेरे लिए असली समस्या यह है कि इस धारणा को देखने के लिए मेरे पास 64-बिट मशीन नहीं है। – bialix

+0

विंडोज/64 बिल्ड 'win32' का उपयोग करता है। (जाहिर है कि अन्य 64-बिट ऑपरेटिंग सिस्टम नहीं हैं) –

3

व्यक्तिगत रूप से मैं अंतर्निहित प्लेटफ़ॉर्म का पता लगाने के लिए platinfo का उपयोग करता हूं।

>>> from platinfo import PlatInfo 
>>> pi = PlatInfo() 
>>> pi.os 
'win64' 
>>> pi.arch 
'x64' 
>>> pi.name() 
'win64-x64' 

32-बिट के लिए, pi.name() रिटर्न win32-x86

+2

यदि मैं वेनिला पायथन से जो चाहता हूं उसे प्राप्त कर सकता हूं तो मैं अतिरिक्त निर्भरताओं का उपयोग करने से बचूंगा। – bialix

3

सूचना है कि आप Jython पर या तो sys.platform या os.name उपयोग नहीं कर सकते इस लिए:

$ jython -c "import sys, os; print sys.platform; print os.name" 
java1.6.0_20 
java 

मुझे लगता है कि CPython के रूप में इसी तरह अंतर्निहित ओएस रिपोर्ट करने के लिए os.name बदलने के लिए Jython परियोजना में एक योजना है, लेकिन क्योंकि लोग यह जांचने के लिए os.name == 'java' का उपयोग कर रहे हैं कि वे ज्योथन पर हैं, यह परिवर्तन रातोंरात नहीं किया जा सकता है। हालांकि, पहले से ही os._name ज्योथन 2.5 पर है।एक्स:

$ jython -c "import os; print os._name" 
posix 

व्यक्तिगत तौर पर मैं कोड Jython और CPython पर दोनों को चलाने के लिए की जरूरत है साथ os.sep == '/' का उपयोग करते हैं, और दोनों Windows और Unixy प्लेटफार्मों पर। यह कुछ हद तक बदसूरत है लेकिन काम करता है।

+0

आयरनपीथन 'sys.platform ==' cli 'के लिए। – Gabe