How can I get a list of locally installed Python modules? How can I get a list of locally installed Python modules? python python

How can I get a list of locally installed Python modules?


help('modules')

in a Python shell/prompt.


Solution

Do not use with pip > 10.0!

My 50 cents for getting a pip freeze-like list from a Python script:

import pipinstalled_packages = pip.get_installed_distributions()installed_packages_list = sorted(["%s==%s" % (i.key, i.version)     for i in installed_packages])print(installed_packages_list)

As a (too long) one liner:

sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])

Giving:

['behave==1.2.4', 'enum34==1.0', 'flask==0.10.1', 'itsdangerous==0.24',  'jinja2==2.7.2', 'jsonschema==2.3.0', 'markupsafe==0.23', 'nose==1.3.3',  'parse-type==0.3.4', 'parse==1.6.4', 'prettytable==0.7.2', 'requests==2.3.0', 'six==1.6.1', 'vioozer-metadata==0.1', 'vioozer-users-server==0.1',  'werkzeug==0.9.4']

Scope

This solution applies to the system scope or to a virtual environment scope, and covers packages installed by setuptools, pip and (god forbid) easy_install.

My use case

I added the result of this call to my flask server, so when I call it with http://example.com/exampleServer/environment I get the list of packages installed on the server's virtualenv. It makes debugging a whole lot easier.

Caveats

I have noticed a strange behaviour of this technique - when the Python interpreter is invoked in the same directory as a setup.py file, it does not list the package installed by setup.py.

Steps to reproduce:

Create a virtual environment
$ cd /tmp$ virtualenv test_envNew python executable in test_env/bin/pythonInstalling setuptools, pip...done.$ source test_env/bin/activate(test_env) $ 
Clone a git repo with setup.py
(test_env) $ git clone https://github.com/behave/behave.gitCloning into 'behave'...remote: Reusing existing pack: 4350, done.remote: Total 4350 (delta 0), reused 0 (delta 0)Receiving objects: 100% (4350/4350), 1.85 MiB | 418.00 KiB/s, done.Resolving deltas: 100% (2388/2388), done.Checking connectivity... done.

We have behave's setup.py in /tmp/behave:

(test_env) $ ls /tmp/behave/setup.py/tmp/behave/setup.py
Install the python package from the git repo
(test_env) $ cd /tmp/behave && pip install . running install...Installed /private/tmp/test_env/lib/python2.7/site-packages/enum34-1.0-py2.7.eggFinished processing dependencies for behave==1.2.5a1

If we run the aforementioned solution from /tmp

>>> import pip>>> sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])['behave==1.2.5a1', 'enum34==1.0', 'parse-type==0.3.4', 'parse==1.6.4', 'six==1.6.1']>>> import os>>> os.getcwd()'/private/tmp'

If we run the aforementioned solution from /tmp/behave

>>> import pip>>> sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])['enum34==1.0', 'parse-type==0.3.4', 'parse==1.6.4', 'six==1.6.1']>>> import os>>> os.getcwd()'/private/tmp/behave'

behave==1.2.5a1 is missing from the second example, because the working directory contains behave's setup.py file.

I could not find any reference to this issue in the documentation. Perhaps I shall open a bug for it.


Now, these methods I tried myself, and I got exactly what was advertised: All the modules.

Alas, really you don't care much about the stdlib, you know what you get with a python install.

Really, I want the stuff that I installed.

What actually, surprisingly, worked just fine was:

pip freeze

Which returned:

Fabric==0.9.3apache-libcloud==0.4.0bzr==2.3b4distribute==0.6.14docutils==0.7greenlet==0.3.1ipython==0.10.1iterpipes==0.4libxml2-python==2.6.21

I say "surprisingly" because the package install tool is the exact place one would expect to find this functionality, although not under the name 'freeze' but python packaging is so weird, that I am flabbergasted that this tool makes sense. Pip 0.8.2, Python 2.7.