I'm writing a chat program for a local network. I would like be able to identify computers and get the user-set computer name with Python.
Use socket
and its gethostname()
functionality. This will get the hostname
of the computer where the Python interpreter is running:
import socket
print(socket.gethostname())
Both of these are pretty portable:
import platform
platform.node()
import socket
socket.gethostname()
Any solutions using the HOST
or HOSTNAME
environment variables are not portable. Even if it works on your system when you run it, it may not work when run in special environments such as cron.
python -m timeit "import socket; socket.gethostname()" 10000 loops, best of 3: 76.3 usec per loop
–
Roca python -m timeit "import platform; platform.node()" 1000000 loops, best of 3: 0.74 usec per loop
–
Roca import os, platform; os.getenv('HOSTNAME', os.getenv('COMPUTERNAME', platform.node())).split('.')[0]
should be cross-platform and support environment variables if they exist - which permits some user control in exigent circumstances, eg HOSTNAME=correct python xyz.py
–
Saki socket.gethostname
compare to platform.node
in terms of the inconsistency you describe? –
Draughty platform.node()
is so much faster than others? –
Firsthand platform.node()
returns a cached value. socket.gethostname()
does not. Example: import platform, socket, subprocess; p = lambda: print(platform.node(), socket.gethostname()); p(); subprocess.run(['sudo', 'hostnamectl', 'set-hostname', foo']); p()
. While both functions return the same correct value on the first call, after the hostname has been changed platform.node()
still returns the old value. –
Haight You will probably load the os module anyway, so another suggestion would be:
import os
myhost = os.uname()[1]
os
module. Not portable and not really accurate, but handy anyway. –
Getupandgo platform.uname()[1]
, which DOES work on Windows. –
Jackquelin os.uname()
actually returns a namedtuple
one can also do the more descriptive myhost = os.uname().nodename
–
Lubbock platform.uname()[1]
or platform.node()
should work well everywhere. –
Granddaddy What about :
import platform
h = platform.uname()[1]
Actually you may want to have a look to all the result in platform.uname()
platform.uname().node
is a bit more verbose than platform.uname()[1]
, I assume it was introduced around the same time as the os.uname
equivalent mentioned in another comment. –
Mythological platform.node()
–
Improvise os.getenv('HOSTNAME')
and os.environ['HOSTNAME']
don't always work. In cron jobs and WSDL, HTTP HOSTNAME isn't set. Use this instead:
import socket
socket.gethostbyaddr(socket.gethostname())[0]
It always (even on Windows) returns a fully qualified host name, even if you defined a short alias in /etc/hosts.
If you defined an alias in /etc/hosts then socket.gethostname()
will return the alias. platform.uname()[1]
does the same thing.
I ran into a case where the above didn't work. This is what I'm using now:
import socket
if socket.gethostname().find('.')>=0:
name=socket.gethostname()
else:
name=socket.gethostbyaddr(socket.gethostname())[0]
It first calls gethostname to see if it returns something that looks like a host name, if not it uses my original solution.
socket.getfqdn()
, though it is not what the OP asks –
Expert socket.gethostbyaddr(socket.gethostname())
on my machine (which is running FreeBSD) returns ('localhost', ['my-machine-name', 'my-machine-namelocaldomain'], ['::1'])
, so returning the first element just returns localhost
. (Meanwhile, socket.gethostname()
returns my-machine-name
for me.) –
Eleanoreleanora From at least python >= 3.3:
You can use the field nodename
and avoid using array indexing:
os.uname().nodename
Although, even the documentation of os.uname suggests using socket.gethostname()
os.uname
is available only on "recent flavors of Unix" –
Renz If I'm correct, you're looking for the socket.gethostname function:
>> import socket
>> socket.gethostname()
'terminus'
You have to execute this line of code
sock_name = socket.gethostname()
And then you can use the name to find the addr :
print(socket.gethostbyname(sock_name))
To get fully qualified hostname use socket.getfqdn()
import socket
print socket.getfqdn()
localhost
, and not even the hostname as returned by socket.gethostname()
. –
Synclastic On some systems, the hostname is set in the environment. If that is the case for you, the os module can pull it out of the environment via os.getenv. For example, if HOSTNAME is the environment variable containing what you want, the following will get it:
import os
system_name = os.getenv('HOSTNAME')
Update: As noted in the comments, this doesn't always work, as not everyone's environment is set up this way. I believe that at the time I initially answered this I was using this solution as it was the first thing I'd found in a web search and it worked for me at the time. Due to the lack of portability I probably wouldn't use this now. However, I am leaving this answer for reference purposes. FWIW, it does eliminate the need for other imports if your environment has the system name and you are already importing the os module. Test it - if it doesn't work in all the environments in which you expect your program to operate, use one of the other solutions provided.
HOSTNAME=$HOSTNAME python
–
Slap I needed the name of the PC to use in my PyLog conf file, and the socket library is not available, but os library is.
For Windows I used:
os.getenv('COMPUTERNAME', 'defaultValue')
Where defaultValue is a string to prevent None being returned
© 2022 - 2024 — McMap. All rights reserved.
socket.getfqdn()
– Laith