How to find out your IP address in Python

24 November 2007

Interesting Fact for Anoraks

Before Avahi and Zeroconf and so on, the classic way that a computer knows where to find other machines on the network is the hosts file. The /etc directory is the main location for configuration files on Linux/Unix. So the location for the hosts file is /etc/hosts.

BSD had one of the first implementations of an TCP/IP stack, this was then taken by a company called Spider Systems and flogged to Microsoft, who added it to Windows NT. Over time, much of Microsoft's TCP/IP layer has probably been modified and re-factored over time, but there is a continuous line of code from BSD to Windows NT/XP/VISTA.

So in these later Windows systems, where is the hosts file? It is:

C:/WINDOWS/system32/drivers/etc/hosts

Which is pretty interesting (or not if you are without your anorak).

How to find out your hostname

The hostname is the computer's individual name. To find out your hostname on a Linux/Unix system, you can use the coreutils command uname:

uname -n

(There are also various commands called 'hostname' which very according to platform).

There is also a C function gethostname() (in Linux provided by glibc), this makes a call to the system information and returns the name of the system.

The Python Socket Module is a binding to many of these C functions that deal with low-level network programming. So to get the hostname via the socket module, you can run:

> ::import socket > socket.gethostname() >

If you are not used to python, just type this into a terminal:

python -c 'import socket; print socket.gethostname()'

How to find out your IP Address

Now we might like to find out the IP Address of the system. This is slightly more difficult to do cleanly and in a cross-platform fashion.

There was a discussion on the Python mailing list today when someone asked exactly this question.

A common way to get the IP address of the local system is to use the socket module's binding to the C function called gethostbyname() and then feed in the hostname that we discovered above:

> ::import socket > socket.gethostbyname(socket.gethostname()) >

This will work for many systems but not all. Most servers will have a fixed IP address added to their /etc/hosts file. However, desktops often will not have this, especially if they are laptops that move from network to network.

Jean-Paul Calderone replied to the mailing list with a cunning solution; prepare a dummy socket and see what the socket name is:

> ::import socket > s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) > s.connect(('google.com', 0)) > s.getsockname()[0] >

Discuss this post - Leave a comment

1 Zeth says...

Okay this is not cross-platform, but rather cool for how many different text processing tools you can get in there:

import os
os.popen("ifconfig eth0 | grep inet | awk '{print $2}' | sed -e s/.*://", "r")

Posted at 1:02 a.m. on November 25, 2007


2 Zeth says...

In CGI, showing the remote IP of the visitor is simply a matter of getting os.environ['REMOTE_ADDR'] as demonstrated here: http://zeth.me.uk/python/myip.txt

Of course, if the browser has a router then the IP address will come from that.

Posted at 1:16 a.m. on November 25, 2007


3 Arne Babenhauserheide says...

Many thanks for the info!

But the problem is: This doesn't reach out over a NAT.

It would be nice to have it implemented in the standard-module, giving me the option to specify the host to use.

Something like

socket.getlocalip

socket.getexternalip

Posted at 6:51 p.m. on November 25, 2007


4 Shahzad says...

Hi am trying to upload my website by using coffe cup in server option .. it requires 1. server name ,, user name ,and password, well am not able to find my server name can any body help me with this

Posted at 4:03 a.m. on July 6, 2008


5 Serg says...

# -- coding: utf-8 -- #????????? ?????? ip-??????? ?????, ?? ??????? ???????? ?????????

import socket

#?????????? ?????? IP-??????? ?????, ?? ??????? ???????? ????????? # ?????????: # ??? # ???????????? ????????: # ?????? IP-??????? (????? ? ????????? ???? 'a.b.c.d') def GetIP ():

System Message: ERROR/3 (<string>, line 12)

Unexpected indentation.
return socket.gethostbyname_ex(socket.gethostname())[2]

#???????????? if __name__=='__main__':

System Message: ERROR/3 (<string>, line 16)

Unexpected indentation.

print 'IP addresses:' for i in GetIP():

System Message: ERROR/3 (<string>, line 18)

Unexpected indentation.
print i

Posted at 4:02 p.m. on July 6, 2009


6 iki says...

local_ip = set([ i[4][0] for i in socket.getaddrinfo(socket.gethostname(), None) if i[0] == 2 ])

Posted at 7:31 a.m. on November 2, 2009


7 iki says...

or simpler: socket.gethostbyname_ex(socket.gethostname())[2]

Posted at 7:35 a.m. on November 2, 2009


What do you have to say?

Show Editing Help

About

Hello, my name is Zeth, I'll be your host here.

Command Line Warriors is about taking control of your own technology, it looks at our experiences of computing; especially using GNU/Linux, the Python programming language, the command-line and issues such as techno-ethics, best practices and whatever is cool now. If you take control of your technology then you are a Warrior too!

This site is your site too which means that you can contribute and get involved. You can leave comments using the facility provided. For me, the comments and discussions are by far the best part of the site. So please do have your say!

Latest Discussions

Zeth

November 29, 2009
Hi Jordan, yes that URL is gone now. I have a new contact form on this site.
Python CGI contact forms

Jordan

November 29, 2009
Zeth attention! Your form, http://zeth.me.uk/contact/, is not working The explorer says connecting ..but nothing happens Sorry for my poor English: I am Spanish Regards
Python CGI contact forms

Jordan

November 26, 2009
Sorry: tell me , not tellme (I'm spaniard) And http://zeth.me.uk/contact/ don't work
You got the touch, you got the power

David Jones

November 25, 2009
Your mad skillz are too l33t! for me. I specifically switched to Google Reader so that I could show people what blogs I read. But I couldn't work out how ...
How to find the fashionable blogs quickly

Brian R. Hickey

November 20, 2009
Symantec picked it up too.
How to bring down Internet Explorer with six words

Zeth

November 17, 2009
Thanks djm, I am the moose here. Christian, assuming one actually does Internationalise the countries, it should still work I guess, as the gettext stuff will happen before the list ...
Countries in Django

Phillip Temple

November 17, 2009
Good start, but: a) wouldn't I want None back rather than 'ZZ'? b) why not add a 'shortcut' boolean, then prepend flagged fields (plus usual '-----' separator) to the actual ...
Countries in Django

djm

November 17, 2009
Am I being a moose or did you mean: from whatever.countries import CountryField instead of from whatever.countries import CharField ? Good post though, cheers.
Countries in Django

Christian Joergensen

November 17, 2009
Wouldn't the ordering get messed up after i18n?
Countries in Django

Steve - Electronic Cigarettes Fan

November 17, 2009
Very well done. Is your blog just you writing? Nicely done, Steven.
Blogger vs Wordpress

vetetix

November 15, 2009
Sorry to bother you nearly two years after you wrote this blog article, but I can't manage to find how to modify an existing field. I am trying to change ...
Three Useful Python Bindings - ClamAV, Apt and Evolution

Manju

November 4, 2009
I am transferring some files using psftp to other device's FAT partition. But the filestamp of the file being transferred is modified to that of FAT device, after the transfer. ...
PuTTY Series: Using PSFTP

iki

November 2, 2009
or simpler: socket.gethostbyname_ex(socket.gethostname())[2]
How to find out your IP address in Python

iki

November 2, 2009
local_ip = set([ i[4][0] for i in socket.getaddrinfo(socket.gethostname(), None) if i[0] == 2 ])
How to find out your IP address in Python

Fred

November 2, 2009
testing rst ------------- - point 1
An Introduction to ReStructuredText

Ano

October 27, 2009
"You simply found the license of the StumbleUpon Toolbar for Internet Explorer." That's possible. I've got some more interesting information to add. Firstly, go to this page: https://addons.mozilla.org/en-US/firefox/addon/138 - this ...
Are your Firefox extensions proprietary software?

Ken

October 21, 2009
Stumbled in here at lunch. This is the best find of the week. Thanks.
Three classic command line tips

Jim

October 19, 2009
Thanks for the rtsp:// post - that's something that has been bugging me for a while!
Three classic command line tips

Zeth

October 18, 2009
Thanks for the comments guys. Great to see the all the gang are still here!
Three classic command line tips

Bubba

October 18, 2009
Is there any way psftp can return the true transfer rates oberved during the actual transfer?
PuTTY Series: Using PSFTP