Pythonスクリプトを実行しているWindowsコンピューターの名前を取得していますか?


94

基本的に、私はネットワーク上にpythonスクリプトを実行するいくつかのWindowsコンピューターを持っています。このスクリプトを実行しているコンピューターに応じて、異なる構成オプションのセットをスクリプトで使用する必要があります。

Pythonスクリプトでそのコンピューター名を取得するにはどうすればよいですか?

スクリプトがDARK-TOWERという名前のコンピューターで実行されていたとしましょう。次のように記述します。

>>> python.library.get_computer_name()
'DARK-TOWER'

使用できる標準またはサードパーティのライブラリはありますか?

回答:


160

次の3つのオプションがあることが判明しました(すでに回答済みの2つを含む)。

>>> import platform
>>> import socket
>>> import os
>>> platform.node()
'DARK-TOWER'
>>> socket.gethostname()
'DARK-TOWER'
>>> os.environ['COMPUTERNAME']
'DARK-TOWER'

16
自分の質問に答えるが、一部で悪趣味と考えるが、それはよくある質問ごとに、まったく問題ありすることができる。stackoverflow.com/faq
Stephan202

9
Ericがいくつかの異なる応答を単一のリソースにコンパイルしていることは言うまでもなく、新しいもの(プラットフォーム)を追加することは言うまでもありません。
nilamo 2009

4
わかりましたので、これはフォローアップを叫びます:platform.node()とsocket.gethostname()の違いは何ですか?彼らは今までと違うことができますか?
Jason S

4
posixシステムでsocket.gethostname()は、libc gethostname()platform.node()返しますが、platform.uname()[1]どちらがos.uname()libcを呼び出すかにある程度関連していますuname()が、同じ場所に到達する可能性があるようですが、そこに到達するまでにかなり異なるパスを使用するため、依存しません。異なるプラットフォーム間で同じになる値。
Peter Gibson

5
それは注目に値するos.environ['COMPUTERNAME']、すべて大文字を返すのに対しますplatform.node()socket.gethostname()混在ケースを返すことができます。
MrNoob 2017


20

5
これは、Python 2.7.2を使用するOS-X 10.6.8では動作しません。Noneを返します。ただし、説明されている他の方法は機能します。
Peter Gibson

2
@PeterGibson Ubuntu 12.04でも同じことが起こりました。
ダニエルF

NoneUbuntu 16.04で私に戻ります。興味深いことに、HOSTNAMEはbashで定義された環境変数ですが、どちらも正しい文字列を返しos.getenv('HOSTNAME')ますが、どちらも返します。Nonesocket.gethostname()
マットハンコック

12

エリックパラコビッチカーが言ったように、これら3つのバリアントを使用できます。

私はそれらを一緒に使用することを好みます:

def getpcname():
    n1 = platform.node()
    n2 = socket.gethostname()
    n3 = os.environ["COMPUTERNAME"]
    if n1 == n2 == n3:
        return n1
    elif n1 == n2:
        return n1
    elif n1 == n3:
        return n1
    elif n2 == n3:
        return n2
    else:
        raise Exception("Computernames are not equal to each other")

クロスプラットフォームアプリケーションを開発する場合は、それを確認することをお勧めします;)


1
少しだけクリーナー:N1 == n2の場合またはN2 == N3:リターンN1のelif N2 == N3:他に戻りN2:昇給の例外(「コンピュータ名が一致していない」)
チャールズPlager

2
@CharlesPlagerこれは以下のようになりますif n1==n2 or n1==n3: return n1 elif n2==n3: return n2 else: raise Exception("Computer names are not equal to each other")n1代わりにn2
dexteritas

@dexteritas:あなたは正しいです。(何らかの理由で編集することはできません)。
Charles Plager 2018年

6

Pythonスクリプトは確かにWindowsシステムで実行されるため、Win32 API GetComputerNameまたはGetComputerNameExを使用する必要があります

完全修飾DNS名、NETBIOS名、またはさまざまな異なるものを取得できます。

import win32api
win32api.GetComputerName()

>>'MYNAME'

または:

import win32api
WIN32_ComputerNameDnsHostname = 1 
win32api.GetComputerNameEx(WIN32_ComputerNameDnsHostname)

>> u'MYNAME'


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.