Pythonでのモジュールの条件付きインポート


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 2010

56
@ S.Lott:真剣に?あなたはアップ/ダウン投票が質問の質を反映することを意図していることを知っていますよね?OPのコードで何か他のことに同意するかどうかではありません。
2011

2
@jalf:文法以外のすべての点で悪い質問です。あらゆる種類の検索に対する上位の応答としては見つかりません。
S.Lott、2011

11
@ S.Lott条件付きインポートがpythonicであるかどうかを知りたいことに問題はありません。そして、あなたの努力にもかかわらず+50の賛成票を獲得しているので、他の人も同意します。
SARose 2016

5
私が探していた概念の+1(Winを使用している場合のみインポート)。ばかげた反対票を埋め合わせるためのもう1つの概念+1。
S3DEV 2018

回答:


182

このイディオムが頻繁に使用されるのを見たので、OSスニッフィングを行う必要さえありません。

try:
    import json
except ImportError:
    import simplejson as json

17
simplejson as json標準jsonモジュールの新しい(高速)バージョンである可能性が高いため、最初にインポートを試行する必要があります。
SeppoErviälä、2012年

または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
            )
        )

これは、特定のインターフェイス/機能が存在することを想定していて、そのような強力な保証が必要な場合にのみ使用する必要があります/dev/ttyX。あなたの場合:JSONを処理する場合、実際にはOS固有のものはなく、パッケージが存在するかどうかを確認するだけです。その場合、tryインポートするだけで、except失敗した場合はフォールバックします。

try:
    import some_specific_json_module as json
except ImportError:
    import json

11
いいえ。OS名をハードコーディングしてsimplejsonjsonが利用可能かどうかを判断することは非常に間違っています。本質的にOS固有のインポートからコードを引用していますが、これはまったく別のケースです。正しいアプローチについては、Mattの回答を参照してください。
Glenn Maynard

16
@Glenn Maynard:そのときは君に任せる。私はjsonパッケージを使用したことがなく、より一般的な「モジュールの条件付きインポートを実行できますか」という質問に答えようとしました。
Nick T

7

jsonまたはsimplejsonをOSプラットフォームにバインドするために使用することはお勧めできません。simplejsonはjsonの最新バージョンであり、最初にインポートする必要があります。

Pythonバージョンに基づいて、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.