私はローカルネットワーク用のチャットプログラムを書いています。 Pythonを使ってコンピュータを識別し、ユーザー設定のコンピュータ名を取得したいと思います。
socket
と gethostname()
の機能を使用してください。これはPythonインタプリタが走っているコンピュータのhostname
を取得します。
import socket
print(socket.gethostname())
どちらもかなり移植性があります。
import platform
platform.node()
import socket
socket.gethostname()
Host
またはHOSTNAME
環境変数を使用した解決策は移植性がありません。実行時にシステム上で動作しても、cronなどの特別な環境で実行されたときには動作しない可能性があります。
とにかくosモジュールをロードするでしょうから、別の提案があります:
import os
myhost = os.uname()[1]
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を呼び出して、ホスト名のようなものを返すかどうかを確認します。そうでない場合は、私のオリジナルのソリューションを使用します。
どうですか?
import platform
h = platform.uname()[1]
実際には、platform.uname()
のすべての結果を調べたいと思うかもしれません。
正しければ、socket.gethostname関数を探しています。
>> import socket
>> socket.gethostname()
'terminus'
socket.gethostname()
ができること
少なくとも からpython> = 3.3 :
あなたはフィールドnodename
を使うことができ、配列のインデックスを使わないでください:
os.uname().nodename
ただし、 os.uname のドキュメントでもsocket.gethostname()
を使用することをお勧めします。
一部のシステムでは、ホスト名は環境に設定されています。もしそうなら、 osモジュール は os.getenv を介して環境からそれを取り出すことができます。例えば、HOSTNAMEがあなたが欲しいものを含む環境変数であるならば、以下はそれを取得するでしょう:
import os
system_name = os.getenv('HOSTNAME')
更新:コメントで述べたように、これは必ずしもうまくいくとは限りません。すべての人の環境がこのように設定されているわけではないからです。私は最初にこれに答えたときに私はそれが私がウェブ検索で見つけた最初の事であったので私がこの解決策を使っていたと信じていて、それはその時私のために働いた。移植性の欠如のために、私はおそらくこれを今は使わないでしょう。しかし、私はこの回答を参考のために残しています。あなたの環境にシステム名があり、あなたがすでにosモジュールをインポートしているのであれば、他のインポートの必要性を排除します。それをテストしてください - あなたのプログラムが動作することを期待しているすべての環境でうまくいかない場合は、提供されている他の解決策の一つを使ってください。
このコード行を実行する必要があります
sock_name = socket.gethostname()
そして、その名前を使ってaddrを見つけることができます。
print(socket.gethostbyname(sock_name))
PyLogの設定ファイルで使用するPCの名前が必要で、ソケットライブラリは利用できませんが、osライブラリは利用できます。
Windows 私が使った:
os.getenv('COMPUTERNAME', 'defaultValue')
DefaultValueはNoneが返されないようにするための文字列です。