web-dev-qa-db-ja.com

PythonでWindowsを確実に検出します

私はいくつかのLinuxツールに取り組んでおり、FHSに依存しているため、そのプラットフォームでは役に立たないため、Windowsへのインストールを防止する必要があります。 platform.platform関数は接近していますが、文字列のみを返します。

残念ながら、信頼できる結果を得るには、その文字列で何を検索すればよいかわかりません。何を検索するか知っている人、または私がここで見逃している別の機能を知っている人はいますか?

52
blokkie
>>> import platform
>>> platform.system()
'Windows'
73
Matthew Iselin

PythonからWindowsを検出するのではなく)からCygwinを検出する方法を探している人のために、os.nameおよびplatform.systemからの戻り値の例をいくつか示します。異なるプラットフォーム

OS/build     | os.name | platform.system() 
-------------+---------+-----------------------
Win32 native | nt      | Windows
Win32 cygwin | posix   | CYGWIN_NT-5.1*
Win64 native | nt      | Windows
Win64 cygwin | posix   | CYGWIN_NT-6.1-WOW64*
Linux        | posix   | Linux

この時点から、WindowsネイティブとCygwinを区別する方法は明らかであるはずですが、これが将来の証明になるとは思いません。

*バージョン番号はXPとWin7のそれぞれのものであり、それらに依存しないでください

55
sbk

私のWindowsボックスでは、platform.system()'Windows'を返します。

しかし、なぜあなたが気になるのかはわかりません。技術的に動作するプラットフォームを制限したい場合は、ブラックリストではなくホワイトリストを使用します。

実際、おそらく次のリリースのPythonにはWindowsではなくWin32/Win64が含まれる可能性があるため(ブラックリスト用)、 Linuxの代わりに*nix(ホワイトリスト用)。

私のアドバイスは、要件が何であるかを単に述べることであり、ユーザーがそれを無視することを選択した場合、それは彼らの問題です。 「FHSが見つかりません」というエラーメッセージが表示され、Windowsで実行していることを認めたという連絡があった場合は、サポートされている構成ではないことをそっと指摘します。

多分あなたの顧客はあなたのコードが動くようにFHSをWindowsの下で走らせるのに十分賢いです。彼らがあなたのソフトウェアの恣意的な制限を検討することを彼らが理解することはまずないでしょう。

これは、ソフトウェア開発者が毎日直面している問題です。巨大な組織でさえevery単一のプラットフォームと構成をサポートすることはできません。

17
paxdiablo

これを試して:

_import platform

if platform.system() == "Darwin":
    # Don't have Windows handy, but I'd expect "Win32" or "Windows" for it
_

編集:platform.platform()...platform.system()を試したところ、この場合にうまく機能することがわかりました。信じて、使ってください。暗いコーナーはプラットフォームの検出にあります。

distutilsも、きちんと尋ねればこれを行います。

Windowsファイルでは常にos.path.exists()のような悪いことをすることができますが、platformはPython標準ライブラリで取得するのと同じくらい信頼できます。

編集2:platform.system()が彼のWindowsマシンの「Windows」とまったく同じであると指摘した別の役立つ回答者。

10
Jed Smith
>>> import os
>>> os.name
'nt'

"インポートされたオペレーティングシステム依存モジュールの名前。現在登録されている名前は、「posix」、「nt」、「mac」、「os2」、「ce」、「Java」、「riscos」です。 (c) http://docs.python.org/library/os.html#os.name

import os
if os.name == 'nt':
    #yourcodehere
8

ヘルプから(プラットフォーム)

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

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