2011-07-25 11 views
1

私は、配布用にexeファイルを作成するプログラムを持っています。私のクライアントはXPとVistaと7を実行しています。私たちはXPで心配する必要がないので、Win7とVistaでログファイルが書き込まれる場所を調整することでインストールを簡単にしようとしています。 platform.release()を使用してログファイルを書き込む場所を決定しようとしています。 XPでない場合は、os.environ["LOCALAPPDATA"]で指定された場所にログファイルを書き込みます。platform.release()の戻り値を確認するにはどうすればいいですか

XPマシンで実行しているときに、戻り値として「XP」を取得するだけであることを確認しようとしています。Vistaと7では、これらの予想される結果しか得られません。例えばXPのいくつかの風味がXP.v2を返すだろうか(私はこれを作った)?

私たちは答えを求めて周りを回ってきており、特定できるほど具体的なものは見つけられません。

ありがとうございました。 乾杯

+1

代替案として、「if」LOCALAPPDATAが「os.environ: 'にない場合は? –

+0

@altieありがとうございますLOCALAPPDATAがいくつかの設定で追加のセキュリティレイヤーとして存在しないことがありますので、私はWIN7ではLOCALAPPDATAではないことを知りたいと思っています – PyNEwbie

+0

ShgetFolderPathなどでローカルappdataなどのものを取得する必要があります。シェル関数。それは常に正しい結果を提供します。 OSについても心配する必要はありません。 (方法については、[this](http://ginstrom.com/scribbles/2008/09/26/retrieving-common-windows-folder-names-with-python/)のようなものを参照してください) –

答えて

4

最終的な答えは、ソースコードのPythonインタプリタの正確なバージョンに記載されています。私はCPython 2.7.1を使用しています。私は、Windows XPの「XP」以外release値を参照してください期待していない、このコードを読んだ後

winver = GetVersionEx() 
maj,min,buildno,plat,csd = winver 
version = '%i.%i.%i' % (maj,min,buildno & 0xFFFF) 
if hasattr(winver, "service_pack"): 
    if winver.service_pack != "": 
     csd = 'SP%s' % winver.service_pack_major 
else: 
    if csd[:13] == 'Service Pack ': 
     csd = 'SP' + csd[13:] 

if plat == VER_PLATFORM_WIN32_WINDOWS: 
    regkey = 'SOFTWARE\\Microsoft\\Windows\\CurrentVersion' 
    # Try to guess the release name 
    if maj == 4: 
     if min == 0: 
      release = '95' 
     elif min == 10: 
      release = '98' 
     elif min == 90: 
      release = 'Me' 
     else: 
      release = 'postMe' 
    elif maj == 5: 
     release = '2000' 

elif plat == VER_PLATFORM_WIN32_NT: 
    regkey = 'SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion' 
    if maj <= 4: 
     release = 'NT' 
    elif maj == 5: 
     if min == 0: 
      release = '2000' 
     elif min == 1: 
      release = 'XP' 
     elif min == 2: 
      release = '2003Server' 
     else: 
      release = 'post2003' 
    elif maj == 6: 
     if hasattr(winver, "product_type"): 
      product_type = winver.product_type 
     else: 
      product_type = VER_NT_WORKSTATION 
      # Without an OSVERSIONINFOEX capable sys.getwindowsversion(), 
      # or help from the registry, we cannot properly identify 
      # non-workstation versions. 
      try: 
       key = RegOpenKeyEx(HKEY_LOCAL_MACHINE, regkey) 
       name, type = RegQueryValueEx(key, "ProductName") 
       # Discard any type that isn't REG_SZ 
       if type == REG_SZ and name.find("Server") != -1: 
        product_type = VER_NT_SERVER 
      except WindowsError: 
       # Use default of VER_NT_WORKSTATION 
       pass 

     if min == 0: 
      if product_type == VER_NT_WORKSTATION: 
       release = 'Vista' 
      else: 
       release = '2008Server' 
     elif min == 1: 
      if product_type == VER_NT_WORKSTATION: 
       release = '7' 
      else: 
       release = '2008ServerR2' 
     else: 
      release = 'post2008Server' 

else: 
    if not release: 
     # E.g. Win3.1 with win32s 
     release = '%i.%i' % (maj,min) 
    return release,version,csd,ptype 

:ここでは無料でダウンロードでき、そのソースコードは(Lib/platform.pyで見つかった)関連するコードですボックス。

+0

これは素晴らしいです私はソースを見ていただきありがとうございましたが、私はPythonが安定している可能性がありますが、OSは変更できないという馬鹿げた前提を作っていました。しかし、私は最後のelse文で問題を扱っているのを見ています。 – PyNEwbie

関連する問題