파이썬에서 조건부 모듈 가져 오기


140

내 프로그램에서 사용자가 사용하는 OS가 Windows인지 Linux인지에 따라 simplejson 또는 json을 가져오고 싶습니다. 사용자의 입력으로 OS 이름을 사용합니다. 이제 다음을 수행하는 것이 맞습니까?

osys = raw_input("Press w for windows,l for linux")
if (osys == "w"):
    import json as simplejson
else:
    import simplejson  

33
왜 OS 이름을 사용자의 입력으로 사용합니까? 플랫폼 모듈을 살펴보십시오. docs.python.org/library/platform.html platform.platform() 또는 platform.system()코드를 실행할 때마다 사용자가 무언가를 입력하지 말고 필요한 것을 수행해야합니다.
Joe Kington

56
@ S.Lott : 진심으로? up / downvotes가 질문 의 질을 반영한다는 것을 알고 있습니까? 그리고 OP의 코드에서 다른 것에 동의하는지 여부는 아닙니다 .
jalf

2
@ jalf : 문법을 제외한 모든면에서 나쁜 질문입니다. 어떤 종류의 검색에 대해서도 최고의 응답으로 찾을 수 없습니다.
S.Lott

11
@ S.Lott 조건부 수입이 파이썬인지 알고 싶을 때 아무런 문제가 없습니다. 그리고 당신의 노력에도 불구하고 +50의 투표권이 있기 때문에 분명히 다른 사람들이 동의합니다.
SARose

5
내가 찾던 개념에 +1 (Win을 사용하는 경우에만 가져 오기); 그리고 또 다른 개념 +1은 말도 안되는 다운 투표를 보상합니다.
S3DEV

답변:


182

이 관용구가 많이 사용되는 것을 보았으므로 OS 스니핑을 할 필요조차 없습니다.

try:
    import json
except ImportError:
    import simplejson as json

17
simplejson as json표준 json모듈 의 최신 (빠른) 버전 일 수 있으므로 먼저 가져 오십시오 .
Seppo Erviälä

또는 ujson속도
lababidi

59

제목 의 질문에 대답 하지만 특정 사례 는 답변 하지 않으려면 완벽하게 맞습니다. 수 많은 패키지 가이 작업을 수행합니다. 사용자에 의존하는 대신 OS를 직접 파악하는 것이 좋습니다. pySerial이 예제로 수행합니다.

serial/__init__.py

import sys

if sys.platform == 'cli':
    from serial.serialcli import Serial
else:
    import os
    # chose an implementation, depending on os
    if os.name == 'nt':  # sys.platform == 'win32':
        from serial.serialwin32 import Serial
    elif os.name == 'posix':
        from serial.serialposix import Serial, PosixPollSerial, VTIMESerial  # noqa
    elif os.name == 'java':
        from serial.serialjava import Serial
    else:
        raise ImportError(
            "Sorry: no implementation for your platform ('{}') available".format(
                os.name
            )
        )

이것은 당신이 가정하고 특정 인터페이스 / 기능이있을 것이라는 강력한 보증이 필요한 경우에만 사용해야합니다 : 예를 들어 'file' /dev/ttyX. 귀하의 경우 : JSON을 다루는 데 실제로 OS 관련이 없으며 패키지가 존재하는지 여부 만 확인하고 있습니다. 이 경우 try가져 와서 except실패하면 if로 대체하십시오.

try:
    import some_specific_json_module as json
except ImportError:
    import json

11
아니, 그것은 여부를 결정하기 위해 하드 코드의 OS 이름에 매우 잘못된입니다 simplejson또는 json사용할 수 있습니다. 본질적으로 OS 별 가져 오기 에서 코드를 인용합니다 . 이는 매우 다른 경우입니다. 올바른 접근 방법은 Matt의 답변을 참조하십시오.
Glenn Maynard

16
@ Glenn Maynard : 그때 당신에게 연기하겠습니다; 나는 json패키지를 사용한 적이 없으며 더 일반적인 "모듈의 조건부 가져 오기를 할 수 있습니까?"라는 질문에 대답하려고 노력했습니다.
Nick T

7

json 또는 simplejson을 OS 플랫폼과 바인딩하는 데 사용하지 않는 것이 좋습니다. simplejson은 json의 최신 고급 버전이므로 먼저 가져와야합니다.

파이썬 버전을 기반으로 json 또는 simplejson을 가져 오는 방법을 시도 할 수 있습니다

import sys
if sys.version_info > (2, 7):
    import simplejson as json
else:
    import json
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.