Python'da modüllerin koşullu olarak içe aktarılması


141

Programımda kullanıcının bulunduğu işletim sisteminin Windows veya Linux olup olmadığına bağlı olarak simplejson veya json'u içe aktarmak istiyorum. İşletim sistemi adını kullanıcıdan girdi olarak alıyorum. Şimdi, aşağıdakileri yapmak doğru mu?

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

33
Neden os adını kullanıcıdan girdi olarak alıyorsunuz? Platform modülüne bakın. docs.python.org/library/platform.html platform.platform() veya platform.system()bir kod her çalıştığında bir kullanıcının bir şey girmesi yerine ihtiyacınız olanı yapmalıdır.
Joe Kington

56
@ S.Lott: cidden mi? Yukarı / aşağı oyların sorunun kalitesini yansıtması gerektiğini biliyorsunuz , değil mi? Ve OP kodunda başka bir şeye katılıp katılmadığınızı değil .
jalf

2
@jalf: Dilbilgisi dışında her açıdan kötü bir soru. Herhangi bir aramaya en iyi yanıt olarak bulunmamalıdır.
S.Lott

11
Koşullu ithalatın pitonik olup olmadığını bilmek istemek yanlış bir şey değil. Ve açıkça, çabalarına rağmen +50 oyu olduğu için diğerleri de aynı fikirde.
SARose

5
Aradığım konsept için +1 (yalnızca Win kullanıyorsanız içe aktarın); ve gülünç oyları telafi etmek için bir başka kavramsal +1.
S3DEV

Yanıtlar:


182

Bu deyimin çok kullanıldığını gördüm, bu yüzden OS koklama yapmak zorunda bile değilsin:

try:
    import json
except ImportError:
    import simplejson as json

17
Öncelikle simplejson as jsonstandart jsonmodülün daha yeni (daha hızlı) bir sürümü olduğundan içe aktarmayı denemelisiniz .
Seppo Erviälä

veya ujsonhız için
lababidi

59

Başlığınızdaki soruyu cevaplamak, ancak sağladığınız özel durum için değil, çok doğru, tonlarca paket bunu yapıyor. Kullanıcıya güvenmek yerine işletim sistemini kendiniz bulmak muhtemelen daha iyidir; İşte pySerial bunu örnek olarak yapıyor.

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
            )
        )

Bu, yalnızca belirli arayüzlerin / özelliklerin orada olacağını varsaydığınız ve güçlü bir garantiye ihtiyaç duyduğunuz durumlarda kullanılmalıdır: örneğin bir 'dosya' denir /dev/ttyX. Sizin durumunuzda: JSON ile uğraşırken, aslında işletim sistemine özgü bir şey yoktur ve yalnızca paketin var olup olmadığını kontrol edersiniz. Bu durumda, sadece tryiçe aktarmak ve exceptbaşarısız olursa bir geri çekilmek için :

try:
    import some_specific_json_module as json
except ImportError:
    import json

11
Hayır, karar vermek için kod gömmek OS adlarına çok yanlış olduğunu simplejsonveya jsonmevcuttur. Kodu işletim sistemine özgü ithalatlardan alıyorsunuz , bu çok farklı bir durum. Doğru yaklaşım için Matt'in cevabına bakınız.
Glenn Maynard

16
@ Glenn Maynard: Sana ertelerdim; jsonPaketi hiç kullanmadım ve daha genel "modüllerin koşullu ithalatını yapabilir misiniz?" Sorusunu yanıtlamaya çalışıyordum.
Nick T

7

İşletim sistemi platformuyla json veya simplejson'u bağlamak için kullanılması önerilmez. simplejson, json'un daha yeni ve gelişmiş bir sürümüdür, bu yüzden önce içe aktarmaya çalışmalıyız.

Python sürümüne göre json veya simplejson'u içe aktarmanın aşağıdaki yolunu deneyebilirsiniz

import sys
if sys.version_info > (2, 7):
    import simplejson as json
else:
    import json
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.