Os.name, sys.platform veya platform.system ne zaman kullanılır?


106

Bildiğim kadarıyla, Python'un hangi işletim sistemi üzerinde çalıştığını bulmanın 3 yolu vardır:

  1. os.name
  2. sys.platform
  3. platform.system()

Bu bilgilerin bilinmesi, koşullu içe aktarmalarda veya platformlar arasında farklılık gösteren işlevselliklerde (örneğin time.clock(), Windows ve time.time()UNIX'te) yararlıdır .

Sorum şu, neden bunu yapmanın 3 farklı yolu var? Ne zaman bir yol kullanılmalı, diğeri değil? Hangi yol 'en iyi' (geleceğe dönük en iyisi veya programınızın gerçekten çalışabileceği belirli bir sistemi yanlışlıkla dışlama olasılığı en düşük)?

Öyle görünüyor ki sys.platformdaha spesifiktir os.namesen ayırt sağlayan win32den cygwin(sadece karşıt olarak nt) ve linux2gelen darwin(sadece karşıt olarak posix). Ama eğer öyleyse, sys.platformve arasındaki fark ne olacak platform.system()?

Örneğin, hangisi daha iyi, bu:

import sys
if sys.platform == 'linux2':
    # Do Linux-specific stuff

veya bu? :

import platform
if platform.system() == 'Linux':
    # Do Linux-specific stuff

Şimdilik sadık kalacağım sys.platform, bu yüzden bu soru özellikle acil değil, ancak bununla ilgili bazı açıklamalar için çok minnettar olurum.


15
gelecekteki uyumluluk için sys.platform.startswith('linux')yerine kullanınsys.platform == 'linux2'
jfs

Yanıtlar:


69

Kaynak koduna biraz daldı.

Çıktısı sys.platformve os.namederleme zamanında belirlenir. platform.system()çalışma zamanında sistem türünü belirler.

  • sys.platform derleyici yapılandırması sırasında tanımlı olarak belirtilir.
  • os.namebelirli işletim sistemine özgü modüllerin mevcut olup olmadığını kontrol eder (örn posix. nt, ...)
  • platform.system()unameçalışma zamanında sistem türünü belirlemek için gerçekte çalışır ve potansiyel olarak birkaç başka işlev vardır.

Benim önerim:

  • os.namePosix uyumlu bir sistem olup olmadığını kontrol etmek için kullanın .
  • sys.platformLinux, cygwin, darwin, atheos vb. Olup olmadığını kontrol etmek için kullanın .
  • platform.system()Diğer kaynaklara inanmıyorsanız kullanın .

2
Daha fazla araştırma yaptım ve işte ayrıntılı cevap: stackoverflow.com/a/58071295/207661 .
Shital Şah

21

Arasında ince bir çizgi fark vardır platform.system()ve sys.platformve ilginç Çoğu durumda için platform.system()için Degeneratessys.platform

İşte Kaynak ne Python2.7\Lib\Platform.py\systemdiyor

def system():

    """ Returns the system/OS name, e.g. 'Linux', 'Windows' or 'Java'.

        An empty string is returned if the value cannot be determined.

    """
    return uname()[0]

def uname():
    # Get some infos from the builtin os.uname API...
    try:
        system,node,release,version,machine = os.uname()
    except AttributeError:
        no_os_uname = 1

    if no_os_uname or not filter(None, (system, node, release, version, machine)):
        # Hmm, no there is either no uname or uname has returned
        #'unknowns'... we'll have to poke around the system then.
        if no_os_uname:
            system = sys.platform
            release = ''
            version = ''
            node = _node()
            machine = ''

Ayrıca belgelere göre

os.uname ()

Mevcut işletim sistemini tanımlayan bilgileri içeren bir 5-demet döndürür. Tuple 5 dize içerir: (sysname, nodename, release, version, machine). Bazı sistemler düğüm adını 8 karaktere veya baştaki bileşene indirger; ana bilgisayar adını almanın daha iyi bir yolu socket.gethostname () veya hatta socket.gethostbyaddr (socket.gethostname ()) şeklindedir.

Availability: recent flavors of Unix.

11

Gönderen sys.platformdocs :

  • os.name daha kaba bir ayrıntıya sahiptir
  • os.uname() sisteme bağlı sürüm bilgisi verir
  • platformModül sistem kimliğinden ayrıntılı kontroller sağlar

Genellikle, bazı işlevlerin kullanılabilir olup olmadığını test etmenin "en iyi" geleceğe yönelik yolu, onu kullanmaya çalışmak ve başarısız olursa bir geri dönüş kullanmaktır.

sys.platform ve platform.system () arasındaki fark ne olacak?

platform.system()o çeşitli kaynaklardan elde olabileceğini normalleştirilmiş değeri döndürür: os.uname(), sys.platform, verkomut (Windows üzerinde).


10

Test edilmemiş bir sistemde istisna yükseltmeyi veya herhangi bir şey denemeyi tercih edip etmemenize ve kodunuzun benzer bir test edilmemiş sistemde çalışıp çalışamayacak kadar yüksek veya düşük seviyede olmasına bağlıdır (örn. gömülü ARM sistemleri). Daha fazla pitonik bilinen tüm sistemleri sıralamak değil, olası ilgili özellikleri test etmektir. (örneğin, sistemin dayanıklılığı, ancak önemsiz çoklu işlem özellikleri olarak kabul edilir.)

  • os.name, osmodülün doğru kullanımı için yeterli bir çözümdür . Python 2.7'de olası değerler 'posix', 'nt', 'os2', 'ce', 'java' veya 'riscos' iken, Python 3.4'ten beri sadece 'posix', 'nt' ve 'java' kullanılmaktadır.

  • sys.platform daha hassas bir çözümdür. if sys.platform.startswith('linux')"Linux2" bir Linux çekirdeği sürümü 2.xx veya 3 anlamına geldiğinden, deyim kullanılması önerilir . Daha eski çekirdekler şu anda hiçbir zaman kullanılmamaktadır. Python 3.3'te tüm Linux sistemleri basit 'linux'dur.

"Mac" ve "Java" sistemlerinin özelliklerini bilmiyorum ve bu yüzden dallanma için platform.system () çok iyi yöntem sonuçlarını kullanamıyorum, ancak platformmesajlar ve hata günlüğü için modülün avantajlarını kullanacağım .


os.nameMümkün dönüş değerleri 'posix', 'nt', 'java'uygun Python 3 docs . Ayrıca bkz: platform modülü belgeleri . Ben do not inanmak 'riscos've 'os2mümkün dönüş değerlerdir ' os.name; dan dönüş değerlerisys.platform olabilirler . Python 3 sys.platformbelgelerine kapsamlı olması görünmüyor.
afeique

1
@afeique: Cevabımı daha yeni Python için güncelledim, ancak o zaman doğruydu. Python 3.3 - os.name (o zamanın en son sürümü) konusuna bakın . Python 2.7 hala desteklenmektedir ve 'riscos' bunun için olası bir değerdir.
hynekcer

Teşekkürler @hynekcer, Python sürüm numaralarını eklemeye yönelik düzenlemenizi takdir ediyorum. Python 3.3'ten sonra değiştiğini fark etmediğim için özür dilerim. Dokümantasyonun farklı sürümlerini incelemedim ve Python 3 davranışının os.namesürümler arasında tutarlı olduğu konusunda kaba bir varsayımda bulundum . Ayrıca 2.7 belgelerini de tekrar kontrol etmedim , ancak şimdi doğru olduğunuzu biliyorum.
afeique

3

Platform modülünün muhtemelen yeni kod için tercih edildiğine inanıyorum. Diğerleri ondan önce vardı. Bu bir evrimdir ve diğerleri geriye dönük uyumluluk için kalır.


7
Acaba herhangi bir Python geliştiricisinin bunu onaylamasını sağlayabilir miyiz? Belki platform modülünü kim geliştirdiyse.
ztangent
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.