184 votes

Importation conditionnelle de modules en Python

Dans mon programme, je veux importer simplejson ou json selon que le système d'exploitation de l'utilisateur est Windows ou Linux. Je prends le nom de l'OS 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

37 votes

Pourquoi prenez-vous le nom de l'os comme entrée de l'utilisateur ? Regardez dans le module de la plateforme. docs.python.org/library/platform.html platform.platform() o platform.system() devrait répondre à vos besoins, plutôt que de demander à l'utilisateur d'entrer quelque chose à chaque fois que le code est exécuté.

64 votes

@S.Lott : sérieusement ? Vous savez que les votes positifs et négatifs sont censés refléter la qualité de l'article. pregunta n'est-ce pas ? Et pas si vous êtes d'accord avec quelque chose sinon dans le code de l'OP.

2 votes

@jalf : C'est une mauvaise question à tous égards, sauf en ce qui concerne la grammaire. Elle ne devrait pas être trouvée en tant que première réponse à n'importe quel type de recherche.

227voto

Matt Williamson Points 10894

J'ai vu cet idiome très souvent utilisé, vous n'avez donc même pas besoin de renifler l'OS :

try:
    import json
except ImportError:
    import simplejson as json

20 votes

Vous devriez d'abord essayer d'importer simplejson as json car il s'agit probablement d'une version plus récente (plus rapide) de la norme json module.

1 votes

O ujson pour la vitesse

77voto

Nick T Points 5466

Pour répondre à la question de votre titre mais pas le cas particulier que vous fournissez, c'est parfaitement correct, des tonnes de paquets font cela. Il est probablement préférable de comprendre le système d'exploitation vous-même plutôt que de compter sur 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
            )
        )

Cette option ne doit être utilisée que dans les cas où l'on suppose et où l'on a besoin d'une garantie forte que certaines interfaces/fonctionnalités seront présentes : par exemple, un "fichier" appelé /dev/ttyX . Dans votre cas : en traitant avec JSON, il n'y a rien qui soit spécifique au système d'exploitation et vous vérifiez seulement si le paquet existe ou non. Dans ce cas, il suffit de try pour l'importer, et se replier avec un except s'il échoue :

try:
    import some_specific_json_module as json
except ImportError:
    import json

12 votes

Non, il est très incorrect de coder en dur les noms d'OS pour décider si simplejson o json est disponible. Vous citez le code de intrinsèquement spécifiques au système d'exploitation les importations, ce qui est un cas très différent. Voir la réponse de Matt pour l'approche correcte.

19 votes

@Glenn Maynard : Je m'en remets à vous dans ce cas ; je n'ai jamais utilisé l'outil d'évaluation de la qualité de l'air. json et j'essayais de répondre à la question plus générale "pouvez-vous faire des importations conditionnelles de modules".

13voto

Aashutosh jha Points 188

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

En fonction de la version de python, vous pouvez essayer la méthode ci-dessous pour importer json ou simplejson.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X