2010-01-27 16 views
35

Windows üzerinde Python uygulamasını çalıştıran arasındaki ve diğer işletim sistemleri üzerinde ayırt etmek zamanki onay (Linux genellikle) koşullu kullanmaktır:64-bit Python'da sys.platform == 'win32' kontrolünü kullanmak güvenli midir?

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

Ama 64 bit Python daha olduğunda güvenli bugün kullanmaktır acaba son yıllarda yaygın olarak kullanılan? 32 gerçekten 32-bit mi, ya da temelde Win32 API'sini ifade eder mi?

Bir gün sys.platform'un 'win64' olması ihtimali varsa, bu durum daha evrensel olabilir mi?

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

da ben farkında Windows'u algılamak için başka bir yolu vardır:

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

Ama gerçekten başka kodunda ikincisi kullanımını görmedim.

En iyi yol o zaman nedir?

UPD: Yapabiliyorsam, fazla kitaplık kullanmaktan kaçınmak istiyorum. Windows'da çalışmadığımı kontrol etmek için ekstra kitaplık yüklemeyi zorunlu kılmak Linux kullanıcıları için can sıkıcı olabilir.

+1

Bu çok güzel bir soru. Teşekkür ederim. – jathanism

cevap

29

sys.platform, temel Windows sistem BITNESS bakılmaksızın win32 olacaktır:

#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" 

O bu tanıtılan original patch bulmak mümkündür

ana soru şudur: biraz daha açıklama sunmaktadır web çok daha farklı daha Win32 gibi ondan Win64 olduğunu ortak durum genel Python programcısı arife olmamalı r, Python kodunda farklılaşmayı yapmak zorundadır. Ya da, en azından, Python betiği tarafından böyle bir farklılaşmanın, sağlanan diğer mekanizmanın yeterli olduğu (hatta tercih edilir) kadar az olması yeterlidir. Şu anda cevap evet. Umarım MS bu cevabı değiştirmeyecektir. Eğer Jython üzerinde bunun için ya sys.platform veya os.name kullanamaz

+1

Teşekkürler, ihtiyacım olan şey bu. – bialix

+0

Rica ederim! –

1

Windows/32 ve Windows/64 için uyarılar aynıdır, bu nedenle aynı değeri kullanmaları gerekir. Tek fark, örn. sys.maxint ve ctypes. Eğer 32 ile 64 arasındaki farkı ayırt etmeniz gerekiyorsa, o zaman platform en iyi bahistir.

+0

Cevabınızı tam olarak almıyorum. 64-bit Python'un sys.platform'da 'win32' kullanarak oluşturduğunu mu söylüyorsunuz? Benim için asıl sorun, bu varsayımı kontrol etmek için 64-bit makinem yok. – bialix

+0

Windows/64 yapı 'win32' kullanıyor. (tabii ki diğer 64-bit işletim sistemleri yok) –

3

Şahsen, platformun algılanması için platinfo kullanıyorum. 32-bit için

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

, pi.name() döner win32-x86. Eğer (Python 2.6 kaynak dağılımından) PC/pyconfig.h de görebileceğiniz gibi

+2

Vanilya Python'dan ihtiyacım olan şeyi alabiliyorsam, fazladan bağımlılık kullanmamayı tercih ederim. – bialix

3

Uyarı:

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

Ben CPython olarak benzer altta yatan OS bildirmek için os.name değiştirmek için Jython projesinde bir plan olduğunu düşünüyorum, ama insanlar yüzünden Jython'da olup olmadığını kontrol etmek için os.name == 'java' kullanıyorsunuz, bu değişiklik gecede yapılamaz. Bununla birlikte, Jython 2.5 üzerinde zaten os._name var.x:

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

Şahsen Windows ve unixy platformlarda hem Jython ve CPython hem çalıştırmak için gereken kodu ile os.sep == '/' kullanma eğiliminde ve. Biraz çirkin ama işe yarıyor.

+0

IronPython 'sys.platform == 'cli'' için. – Gabe

İlgili konular