2010-12-29 13 views
70

私の知る限りでは、Pythonがオペレーティングシステムが実行されているものを見つけるの3つの方法があります。この情報は、多くの場合に有用である知っos.name、sys.platform、またはplatform.systemはいつ使用しますか?

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

を(Windowsの場合はtime.clock()とUNIXの場合はtime.time())を使用して、プラットフォーム間で異なる機能を使用することができます。

私の質問は、なぜこれを行う3つの異なる方法ですか?いつどのような方法で使うべきですか?どちらの方法が「最良」ですか(将来的なプログラムであるか、プログラムが実際に実行できる特定のシステムを誤って除外する可能性はほとんどありません)。

それは(ちょうどposixではなく)sys.platformは、あなたが(ちょうどntではなく)cygwinからwin32を区別することができ、os.nameより具体的であるように思える、とdarwinからlinux2。しかし、そうなら、sys.platformplatform.system()の違いはどうですか?優れている例えば

、この:

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

またはこれ? :今、私はsys.platformに張り付くことがありますについては

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

ので、この質問は、特に緊急ではないですが、私はこれに関するいくつかの明確化のために非常に感謝されます。

+11

将来の互換性のために 'sys.platform == 'linux2''の代わりに' sys.platform.startswith(' linux ') 'を使用してください – jfs

答えて

2

私はプラットフォームモジュールがおそらく新しいコードの方が望ましいと信じています。他のものはそれの前に存在していた。それは進化であり、他のものは下位互換性のために残っています。

+6

これを確認するPython開発者がいるかどうかは疑問です。プラットフォームモジュールを開発した人もいます。 – ztangent

8

sys.platform docsから:

  • os.nameが粗い粒度
  • os.uname()を持っているが、システム依存のバージョン情報を提供します
  • platformモジュールは、「多くの場合、システムのアイデンティティ

のための詳細なチェックを提供いくつかの機能が利用可能かどうかをテストする未知の最良の方法失敗した場合はフォールバックを使用します。

sys.platformとplatform.system()の違いはどうですか? (Windowsの場合)os.uname()sys.platformverコマンド:

platform.system()は、それが複数のソースから取得する可能性があることを正規化した値を返します。

49

ビットをソースコードに分割しました。

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

  • sys.platformは、ビルド構成時にコンパイラ定義として指定されます。特定のOS特定のモジュールが利用可能であるかどうか
  • os.nameチェック(例えばposixnt、...)
  • platform.system()は、実際に実行時にシステムの種類を決定するuname、潜在的にいくつかの他の機能を実行します。

私の提案、それはPOSIX準拠のシステムだかどうかをチェックし、それは、Linuxのかどうかを確認するためにsys.platformを使用して、cygwinの、ダーウィン、atheos、何でも、あなたは信じていない場合は、よく、platform.system()を使用するos.nameを使用他の情報源

18

ありplatform.system()sys.platform間の細い線の差があると、興味深いことに、ほとんどの場合のためにplatform.system()はここsys.platform

に退化ソースPython2.7\Lib\Platform.py\systemdocumentation

あたりも

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 = '' 

を言っていることです

os.uname()

現在のオペレーティングシステムを識別する情報を含む5タプルを返します。タプルには、(sysname、nodename、 リリース、バージョン、マシン)の5つの文字列が含まれています。一部のシステムでは、ノード名を8 文字または先頭のコンポーネントに切り捨てます。 ホスト名を取得するより良い方法はsocket.gethostname()または socket.gethostbyaddr(socket.gethostname())です。

Availability: recent flavors of Unix. 
7

それはあなたが例外を発生させるか、テストされていないシステム上で何かをしようとすると、あなたのコードは、それがまたは(同様のテストされていないシステム上で動作することができないことができるように、ハイレベルまたは非常に低いレベルであるかどうかを好むかどうかに依存します例えば、テストされていないMac - 「posix」や組み込みARMシステム)。より多くのpythonicは、既知のすべてのシステムを列挙するのではなく、関連する可能性のあるプロパティをテストすることです。 (例えば、それがシステムのエンディアンが、重要でないマルチプロパティ重要であると考えられる。)

  • os.nameはosモジュールの正しい使用のために十分な解像度です。可能な値は 'posix'、 'nt'、 'os2'、 'ce'または 'riscos'です。おそらく最初の2つだけが大部分重要です。

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

「Mac」と「Java」システムの詳細はわからないので、非常に良い方法のプラットフォームの結果を使用することはできません。system()を使って分岐することができますが、メッセージとエラーログにはplatformモジュールの利点があります。

関連する問題