Pythonを使用してシステムのホスト名を取得するにはどうすればよいですか?


680

ローカルネットワーク用のチャットプログラムを書いています。コンピューターを識別し、Pythonでユーザーが設定したコンピューター名を取得できるようにしたいと思います。

回答:


1043

使用socketとそのgethostname()機能。これhostnameにより、Pythonインタープリターが実行されているコンピューターが取得されます。

import socket
print(socket.gethostname())

70
まあ、それは正しくありません。オフラインでも自宅でも機能しますが、今はオフィスなので、別のホスト名が返されます。
DataGreed

74
また、FQDNには次のように使用できますsocket.getfqdn()
Dave Forgac 2013

31
@DataGreedは、ホスト名が変更されているためです。Pythonの問題ではありません。
strickli 2013

4
@DataGreed 1.「ランダム」ではないことは確かですが、そのように見えるかもしれません。2.質問には、「システム名」ではなく「システムホスト名」が含まれています。3.多数のシステム(確かにウィンドウを含まない)では、ホスト名とシステム名は同じです。
strickli 2014年

7
socket.gethostname()とos.uname()[1]またはplatform.uname()[1]の
違いは何ですか?

388

これらはどちらもかなり移植可能です。

import platform
platform.node()

import socket
socket.gethostname()

HOSTまたはHOSTNAME環境変数を使用するソリューションは移植できません。実行時にシステムで機能しても、cronなどの特殊な環境で実行すると機能しない場合があります。


6
まあ、セミポータブル。一部のプラットフォームでは、platform.node()がfqdnを提供し、他のプラットフォームではホスト名のみを提供します
raindog308

3
python -m timeit "import socket; socket.gethostname()" 10000 loops, best of 3: 76.3 usec per loop
レーダーの下

8
python -m timeit "import platform; platform.node()" 1000000 loops, best of 3: 0.74 usec per loop
レーダーの下

7
@BelowtheRadarは心配する必要はありません。通常、これらはスクリプトごとに1回だけ呼び出します。
ロバート

6
platform.node()はos.getenvよりもさらに高速です。gethostnameは候補ではありません。しかし、時間が要因ではない場合:import os, platform; os.getenv('HOSTNAME', os.getenv('COMPUTERNAME', platform.node())).split('.')[0]彼らが存在する場合は、クロスプラットフォームおよびサポート環境変数でなければなりません-緊急の状況では、いくつかのユーザーコントロールを可能にする、例えばHOSTNAME=correct python xyz.py
Orwellophile

121

おそらくとにかくosモジュールをロードするので、別の提案は次のようになります:

import os
myhost = os.uname()[1]

8
osモジュールを使用するソリューションの場合は+1 。移植性がなく、正確ではありませんが、とにかく便利です。
MestreLion 2013

20
os.unameはWindowsではサポートされていません:docs.python.org/dev/library/os#os.uname
Noam Manos

9
また、os.uname()。nodenameを実行して、3.3以降で少し目立つようにすることもできます
Hut8

4
以下の答えは、platform.uname()[1]Windowsで機能する同様の外観を提供します。
幻想的な2015

6
@fantabolous着陸中に回答が変わった可能性があるため、「下」のような定位置単語は使用しないでください;)
Jonathan Komar

65

について:

import platform

h = platform.uname()[1]

実際には、すべての結果を確認したい場合があります platform.uname()


1
UbuntuとWindowsで働いてくれました。ありがとう!👍
GollyJer

61

os.getenv('HOSTNAME')os.environ['HOSTNAME']常に機能するとは限りません。cronジョブとWSDLでは、HTTP HOSTNAMEが設定されていません。代わりにこれを使用してください:

import socket
socket.gethostbyaddr(socket.gethostname())[0]

/ etc / hostsで短いエイリアスを定義した場合でも、常に(Windowsでも)完全修飾ホスト名を返します

あなたがエイリアスを定義した場合の/ etc / hostsその後、socket.gethostname()エイリアスを返します。platform.uname()[1]同じことをします。

上記の方法ではうまくいかない場合があります。これは私が今使っているものです:

import socket
if socket.gethostname().find('.')>=0:
    name=socket.gethostname()
else:
    name=socket.gethostbyaddr(socket.gethostname())[0]

最初にgethostnameを呼び出して、ホスト名のように見えるものを返すかどうかを確認します。そうでない場合は、元のソリューションを使用します。


15
socket.getfqdn()OPが要求するものではありませんが、おそらく必要です
jfs

17

私が正しい場合は、socket.gethostname関数を探しています。

>> import socket
>> socket.gethostname()
'terminus'

13

少なくともpython> = 3.3から

フィールドnodenameを使用して、配列のインデックスの使用を回避できます。

os.uname().nodename

さえの文書化、がos.unameが使用することを提案していますsocket.gethostname()



5

一部のシステムでは、ホスト名が環境に設定されています。それが当てはまる場合、osモジュールos.getenvを介してそれを環境から引き出すことができます。たとえば、HOSTNAMEが必要なものを含む環境変数である場合、次のようにして取得します。

import os
system_name = os.getenv('HOSTNAME')

更新:コメントに記載されているように、全員の環境がこのように設定されているわけではないため、これは常に機能するとは限りません。私が最初にこれに答えたとき、私はこのソリューションを使用していたと思います。それは、それがウェブ検索で最初に見つけたものであり、当時は私にとってうまくいったからです。移植性がないため、おそらく今は使用しないでしょう。ただし、この回答は参考のために残しておきます。FWIW、ご使用の環境にシステム名があり、osモジュールをすでにインポートしている場合は、他のインポートの必要がなくなります。テストしてください。プログラムが動作すると思われるすべての環境で機能しない場合は、提供されている他のソリューションのいずれかを使用してください。


5
これは「None」を返します。投稿したリンクによると、これは変数「HOSTNAME」が存在しないことを意味します...:-/
John

@ジョン:あなたはWindowsを使っていますか?私はLinuxボックスで動作しましたが、WindowsでもNoneを取得しました。
GreenMatt 2010年

@MuhiaNJoroge:それはあなたの実装/インストールに依存すると思います。私がその答えを書いたとき、私はRed Hatの箱にいて、それはうまくいきました。今私はUbuntuを使っていますが、うまくいきません。答えを変更しました。
GreenMatt 2014年

lenovo NASでは機能しません。Noneを返します。今私はインポートソケットプリント(socket.gethostname())を使用しています
Rui Martins

@RuiMartins:私が言ったように、それはどこでも機能するようには見えません。うまくいくものを見つけてよかったです。
GreenMatt

5

PyLogのconfファイルで使用するPCの名前が必要でしたが、ソケットライブラリは使用できませんが、osライブラリは使用できます。

以下のためのWindows私が使用しました:

os.getenv('COMPUTERNAME', 'defaultValue')

defaultValueは、Noneが返されないようにするための文字列です。


12
COMPUTERNAMEはMicrosoftのみの環境変数であり、移植性はありません。
ドワイトスペンサー

1
はい。ただし、MSシステムでは機能し、適切であれば機能します。多くの場合、ここの人々は、実用性と質問のためにそれらを無関係にすると、速度やプラットフォームの独立性にあまりにも巻き込まれてしまいます。
Bill Kidd

7
@BillKidd OPは問題のWindows、OS X、およびLinuxについて言及しているため、システムの移植性が必要であることは非常に合理的な前提です。
zstewart 2015年

1
@BillKidd一般的には、時期尚早の最適化や移植性を回避する必要がありますが、移植性が高いため、すぐに利用でき、間違いなく保守性の高いソリューションを使用しないことは逆になります。
Mad Physicist

2

このコード行を実行する必要があります

sock_name = socket.gethostname()

そして、あなたはその名前を使ってaddrを見つけることができます:

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