os.name, sys.platform 또는 platform.system을 언제 사용합니까?


102

내가 아는 한, 파이썬에는 어떤 운영 체제가 실행되고 있는지 알아내는 세 가지 방법이 있습니다.

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

이 정보를 아는 것은 종종 조건부 가져 오기 또는 플랫폼간에 다른 기능을 사용하는 데 유용합니다 (예 : time.clock()Windows 대 time.time()UNIX).

제 질문은 왜 이렇게하는 3 가지 다른 방법입니까? 한 가지 방법을 사용해야하고 다른 방법은 사용하지 않아야합니까? 어떤 방법이 '최고'입니까 (가장 미래 지향적이거나 프로그램이 실제로 실행될 수있는 특정 시스템을 실수로 제외 할 가능성이 가장 적음)?

것 같다 sys.platform보다 더 구체적입니다 os.name당신이 구별 할 수 있도록 win32에서 cygwin(단지 반대가 nt),과 linux2에서 darwin(단지 반대 posix). 하지만 그 무엇의 차이에 대해 그, 그래서 경우 sys.platformplatform.system()?

예를 들어 더 나은 방법은 다음과 같습니다.

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

아니면 이거? :

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

지금은를 고수 할 것이므로이 sys.platform질문은 특별히 긴급하지는 않지만 이에 대한 설명에 대해 매우 감사하겠습니다.


15
사용하는 sys.platform.startswith('linux')대신에 sys.platform == 'linux2'미래의 호환성을 위해
JFS

답변:


67

소스 코드를 조금씩 살펴 보았습니다.

sys.platform및 의 출력은 os.name컴파일 타임에 결정됩니다. platform.system()런타임에 시스템 유형을 결정합니다.

  • sys.platform 빌드 구성 중에 컴파일러 정의로 지정됩니다.
  • os.name특정 OS의 특정 모듈 여부를 확인 가능하다 (예를 들면 posix, nt...)
  • platform.system()실제로 실행 uname되고 런타임에 시스템 유형을 결정하기 위해 잠재적으로 몇 가지 다른 기능이 있습니다.

나의 제안:

  • os.nameposix 호환 시스템인지 확인하는 데 사용 합니다.
  • sys.platformLinux, cygwin, darwin, atheos 등인지 확인하는 데 사용 합니다.
  • platform.system()다른 출처를 믿지 않는 경우 사용하십시오 .

2
더 많은 연구를 수행했으며 자세한 답변은 stackoverflow.com/a/58071295/207661 입니다.
Shital Shah

20

사이에 얇은 라인의 차이가 platform.system()그리고 sys.platform흥미롭게도 대부분의 경우에 platform.system()로 퇴화는sys.platform

출처가 Python2.7\Lib\Platform.py\system말하는 내용은 다음과 같습니다.

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 = ''

또한 문서에 따라

os.uname ()

현재 운영 체제를 식별하는 정보가 포함 된 5- 튜플을 반환합니다. 튜플에는 (sysname, nodename, release, version, machine)의 5 개 문자열이 있습니다. 일부 시스템에서는 노드 이름을 8 자 또는 선행 구성 요소로 자릅니다. 호스트 이름을 얻는 더 좋은 방법은 socket.gethostname () 또는 socket.gethostbyaddr (socket.gethostname ())입니다.

Availability: recent flavors of Unix.

11

에서 sys.platform문서 :

  • os.name 세분성이 더 낮음
  • os.uname() 시스템에 따른 버전 정보 제공
  • platform모듈은 시스템 ID에 대한 자세한 검사를 제공합니다.

일부 기능을 사용할 수 있는지 여부를 테스트하는 "최선의"미래 보장 방법은 단순히 사용하려고 시도하고 실패 할 경우 대체를 사용하는 것입니다.

sys.platform과 platform.system ()의 차이점은 무엇입니까?

platform.system()그것은 여러 소스에서 얻을 수있는 표준화 된 값을 반환합니다 : os.uname(), sys.platform, ver명령 (Windows의 경우).


10

테스트되지 않은 시스템에서 예외를 발생시키는 것을 선호하는지 아니면 테스트되지 않은 시스템에서 어떤 것을 시도하는 것을 선호하는지, 그리고 코드가 테스트되지 않은 유사한 시스템 (예 : 테스트되지 않은 Mac- 'posix'또는 on 임베디드 ARM 시스템). 더 비단뱀은 알려진 모든 시스템을 열거하는 것이 아니라 가능한 관련 속성을 테스트하는 것입니다. (예 : 시스템의 엔디 애니 스는 중요하지만 중요하지 않은 다중 처리 속성으로 간주됩니다.)

  • os.name은 os모듈 의 올바른 사용을위한 충분한 해결책입니다 . 가능한 값은 Python 2.7에서 'posix', 'nt', 'os2', 'ce', 'java'또는 'riscos'이며 Python 3.4부터는 'posix', 'nt'및 'java'만 사용됩니다.

  • sys.platform은 더 미세한 해상도입니다. if sys.platform.startswith('linux')"linux2"는 Linux 커널 버전 2.xx 또는 3을 의미하므로 관용구 를 사용하는 것이 좋습니다. 이전 커널은 현재 사용되지 않습니다. Python 3.3에서 모든 Linux 시스템은 단순한 'linux'입니다.

"Mac"과 "Java"시스템의 세부 사항을 모르기 때문에 분기에 매우 좋은 방법 인 platform.system ()의 결과를 사용할 수 없지만 platform메시지 및 오류 로깅을 위해 모듈의 장점을 사용 합니다.


os.name가능한 반환 값은 'posix', 'nt', 'java'파이썬 3 오피스 . 참조 : 플랫폼 모듈 문서 . 나는 할 수 없습니다 생각 'riscos''os2에서 가능한 반환 값입니다 ' os.name; 에서 반환 값일sys.platform 수 있습니다 . 파이썬 3 sys.platform설명서는 철저한로 표시되지 않습니다.
afeique

1
@afeique : 최신 Python에 대한 답변을 업데이트했지만 그 당시에는 맞았습니다. Python 3.3-os.name (당시 최신 버전)을 참조하십시오 . Python 2.7은 여전히 ​​지원되며 'riscos'가 가능한 값입니다.
hynekcer

@hynekcer에게 감사합니다. Python 버전 번호를 추가하도록 수정 해 주셔서 감사합니다. 파이썬 3.3 이후 변경된 것을 깨닫지 못해 죄송합니다. 나는 문서의 다른 버전을 정독하지 않았고 파이썬 3의 동작이 os.name버전간에 일관 적이 라고 총체적으로 가정했습니다 . 나는 또한 2.7 문서를 다시 확인하지 않았지만 이제 당신이 옳다는 것을 알고 있습니다.
afeique

3

나는 플랫폼 모듈이 아마도 새로운 코드를 선호한다고 생각합니다. 다른 것들은 그 전에 존재했습니다. 그것은 진화이며 다른 것들은 이전 버전과의 호환성을 위해 남아 있습니다.


7
파이썬 개발자가 이것을 확인할 수 있는지 궁금합니다. 플랫폼 모듈을 개발 한 사람 일 수도 있습니다.
ztangent 2010
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.