127

私の知る限り、Python には、どのオペレーティング システムが実行されているかを調べる方法が 3 つあります。

  1. os.name
  2. sys.platform
  3. platform.system()

この情報を知っておくと、条件付きインポートや、プラットフォーム間で異なる機能を使用する場合 ( time.clock()Windowstime.time()と UNIX など) に役立つことがよくあります。

私の質問は、なぜこれを行うのに3つの異なる方法があるのですか? ある方法を使用し、別の方法を使用しないのはいつですか? 「最良」の方法はどれですか (最も将来性のある方法、またはプログラムを実際に実行できる特定のシステムを誤って除外する可能性が最も低い方法)?

sys.platformは よりも具体的であるように思われるため、 ( だけではなく) と(だけではなく)os.nameを区別できます。しかし、もしそうなら、との違いはどうですか?win32cygwinntlinux2darwinposixsys.platformplatform.system()

たとえば、どちらが優れているか、これは次のとおりです。

import sys
if sys.platform == 'linux2':
    # Do Linux-specific stuff

またはこれ?:

import platform
if platform.system() == 'Linux':
    # Do Linux-specific stuff

今のところ、私は に固執するsys.platformので、この質問は特に緊急ではありませんが、これに関するいくつかの明確化に非常に感謝しています.

4

5 に答える 5

80

ソースコードを少し掘り下げました。

との出力はsys.platformos.nameコンパイル時に決定されます。platform.system()実行時にシステム タイプを決定します。

  • sys.platformビルド構成中にコンパイラ定義として指定されます。
  • os.name特定の OS 固有のモジュールが利用可能かどうかを確認します (例: posixnt...)
  • platform.system()実際に実行unameされ、実行時にシステムの種類を判断するために他のいくつかの関数が実行される可能性があります。

私のおすすめ:

  • os.nameposix 準拠のシステムかどうかを確認するために使用します。
  • sys.platformLinux、cygwin、darwin、atheos などであるかどうかを確認するために使用します。
  • platform.system()他の情報源が信じられない場合に使用してください。
于 2012-07-26T17:43:48.613 に答える
22

There is a thin line difference between platform.system() and sys.platform and interestingly for most cases platform.system() degenerates to sys.platform

Here is what the Source Python2.7\Lib\Platform.py\system says

def system():

    """ Returns the system/OS name, e.g. 'Linux', 'Windows' or 'Java'.

        An empty string is returned if the value cannot be determined.

    """
    return uname()[0]

def uname():
    # Get some infos from the builtin os.uname API...
    try:
        system,node,release,version,machine = os.uname()
    except AttributeError:
        no_os_uname = 1

    if no_os_uname or not filter(None, (system, node, release, version, machine)):
        # Hmm, no there is either no uname or uname has returned
        #'unknowns'... we'll have to poke around the system then.
        if no_os_uname:
            system = sys.platform
            release = ''
            version = ''
            node = _node()
            machine = ''

Also per the documentation

os.uname()

Return a 5-tuple containing information identifying the current operating system. The tuple contains 5 strings: (sysname, nodename, release, version, machine). Some systems truncate the nodename to 8 characters or to the leading component; a better way to get the hostname is socket.gethostname() or even socket.gethostbyaddr(socket.gethostname()).

Availability: recent flavors of Unix.
于 2013-01-13T05:58:35.307 に答える
10

それは、例外を発生させたり、テストされていないシステムで何かを試したりすることを好むかどうか、およびコードが高レベルまたは低レベルであり、同様のテストされていないシステム (たとえば、テストされていない Mac - 'posix' または組み込み ARM システム)。よりpythonicは、既知のシステムをすべて列挙するのではなく、関連する可能性のあるプロパティをテストすることです。(たとえば、システムのエンディアンは重要であると考えられていますが、マルチプロセッシングの特性は重要ではありません。)

  • os.name は、osモジュールを正しく使用するための十分な解決策です。可能な値は、Python 2.7 では 'posix'、'nt'、'os2'、'ce'、'java' または 'riscos' ですが、Python 3.4 以降では 'posix'、'nt' および 'java' のみが使用されます。

  • sys.platform はより細かい解像度です。if sys.platform.startswith('linux')「linux2」は Linux カーネル バージョン 2.xx または 3 を意味するため、イディオムを使用することをお勧めします。古いカーネルは現在使用されていません。Python 3.3 では、すべての Linux システムは単純な「linux」です。

私は「Mac」および「Java」システムの詳細を知らないので、分岐に非常に優れたメソッド platform.system() の結果を使用することはできませんが、platformモジュールの利点をメッセージとエラー ログに使用します。

于 2013-01-13T11:12:56.713 に答える
3

新しいコードにはおそらく platform モジュールが好まれると思います。他のものはそれより前に存在していました。これは進化であり、他のものは下位互換性のために残されています。

于 2010-12-29T10:05:37.753 に答える