Importation conditionnelle de modules en Python

141

Dans mon programme, je souhaite importer simplejson ou json selon que le système d'exploitation sur lequel l'utilisateur se trouve est Windows ou Linux. Je prends le nom du système d'exploitation comme entrée de l'utilisateur. Maintenant, est-il correct de faire ce qui suit?

osys = raw_input("Press w for windows,l for linux")
if (osys == "w"):
    import json as simplejson
else:
    import simplejson  
Tim
la source
33
Pourquoi prenez-vous le nom du système d'exploitation comme entrée de l'utilisateur? Regardez dans le module de plate-forme. docs.python.org/library/platform.html platform.platform() ou platform.system()devrait faire ce dont vous avez besoin, plutôt que d'avoir un utilisateur à saisir quelque chose à chaque fois que le code est exécuté.
Joe Kington
56
@ S.Lott: sérieusement? Vous savez que les votes positifs / négatifs sont censés refléter la qualité de la question , n'est-ce pas? Et pas si vous êtes d'accord avec autre chose dans le code de l'OP.
jalf
2
@jalf: C'est une mauvaise question à tous égards sauf la grammaire. Il ne doit pas être trouvé comme une réponse de premier ordre à tout type de recherche.
S.Lott
11
@ S.Lott il n'y a rien de mal à vouloir savoir si les importations conditionnelles sont pythoniques. Et évidemment, d'autres sont d'accord car il a +50 voix en hausse malgré vos efforts.
SARose
5
+1 pour le concept que je recherchais (import uniquement si vous utilisez Win); et un autre +1 conceptuel pour compenser le ridicule vote négatif.
S3DEV

Réponses:

182

J'ai beaucoup vu cet idiome utilisé, donc vous n'avez même pas besoin de renifler le système d'exploitation:

try:
    import json
except ImportError:
    import simplejson as json
Matt Williamson
la source
17
Vous devez d'abord essayer d'importer simplejson as jsoncar il s'agit probablement d'une version plus récente (plus rapide) du jsonmodule standard .
Seppo Erviälä
ou ujsonpour la vitesse
lababidi
59

Pour répondre à la question dans votre titre mais pas au cas particulier que vous fournissez, c'est parfaitement correct, des tonnes de packages le font. Il est probablement préférable de déterminer vous-même le système d'exploitation au lieu de vous fier à l'utilisateur; voici pySerial qui le fait à titre d'exemple.

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

Cela ne devrait être utilisé que dans les cas où vous supposez et avez besoin d'une solide garantie que certaines interfaces / fonctionnalités seront là: par exemple, un 'fichier' appelé /dev/ttyX. Dans votre cas: en traitant avec JSON, il n'y a rien qui soit réellement spécifique au système d'exploitation et vous ne faites que vérifier si le package existe ou non. Dans ce cas, il suffit tryde l'importer et de revenir en arrière avec un en exceptcas d'échec:

try:
    import some_specific_json_module as json
except ImportError:
    import json
Nick T
la source
11
Non, il est très incorrect de coder en dur les noms de système d'exploitation pour décider si simplejsonou jsonest disponible. Vous citez du code d' importations intrinsèquement spécifiques au système d'exploitation , ce qui est un cas très différent. Voir la réponse de Matt pour la bonne approche.
Glenn Maynard
16
@Glenn Maynard: Je m'en remettrais alors à vous; Je n'ai jamais utilisé le jsonpackage et j'essayais de répondre à la question plus générale "pouvez-vous faire des importations conditionnelles de modules".
Nick T
7

Il n'est pas conseillé d'utiliser pour lier json ou simplejson avec la plate-forme OS. simplejson est une version plus récente et avancée de json, nous devrions donc essayer de l'importer en premier.

Basé sur la version python, vous pouvez essayer ci-dessous la manière d'importer json ou simplejson

import sys
if sys.version_info > (2, 7):
    import simplejson as json
else:
    import json
Aashutosh jha
la source