![]() | Ned Batchelder : Blog | Code | Text | Site Installing Python packages from Windows installers into virtualenv » Home : Blog : July 2010 |
I'm a recent convert to virtualenv, it's a great way to maintain a number of different Python installations so that you can install packages for one project without it polluting the environment for all your projects. I also work on Windows, which can be a pain. In particular, many interesting Python packages involve compiling extensions, which is not always easy, and especially not easy on Windows. So I'm glad when package authors provide pre-built binaries for Windows. These are typically delivered as .exe Windows installers. Here's the problem: these installers know to look in the registry to find the Python installation. There are many things developers dislike about Windows, and the registry is often at the top of the list. One of the bad things about it is that it encourages a mindset of their being one of everything. Starting with the concept of "one registry", it seeps into the whole culture of Windows, invading even to Python, which cannot abide more than one installation of a major release. So when running a Windows package installer, it will find the Python 2.6 installation in the registry, and that's the only option you've got for where the code is going to go. Your nice isolated virtualenvs are completely out of the picture. I asked on Stack Overflow if there's a way to install Windows package installers into virtualenvs, and didn't get the answers I wanted. So I decided the best approach was to change the registry, install my package, then change the registry back. I adapted a classic script to register Python installations, to create what I've called the_python.py: # script to register Python 2.0 or later for use with win32all Use your desired Python to run this script, and it will be entered into the registry as the Python. When you run your Windows package installer, it will go into your virtualenv. Don't forget to run it again at the end to put things back the way they were. | |
Comments
This could be a nice addition to the activate and deavtivate scripts of virtualenv when called with a cmd line switch. With deactivating reversing the changes.
Sounds like an interesting addition to our pythonselect (http://bitbucket.org/activestate/pythonselect/src) that we use for select "the python" in /Library/Frameworks/Python.framework/Versions on Mac.
For me, calling "python.exe pip install" instead of just "pip install" does the trick. The former picks up the currently visible interpreter (made visible by virtualenv) instead of resorting to the registry.
@guillermo - Normal Python packages get installed in the virtualenv correctly once they are activated. Ned is talking about installing from a Windows installers (i.e. a *.exe) which typically looks up the installed version of Python in the registry and installs itself there instead of a virualenv that maybe activated.
Some installers are smart enough to pickup multiple versions of Python installed but I haven't come across any that actually pick up on an active virtualenv. This is the issue that Ned's script is dealing with.
easy_install I think can install Windows .exe files, not just .eggs or source. pip can't, but hopefully that'll be added this summer.
@John M. Camara: I see. I was talking about regular packages only. Also, the fact that Win seems to use different methods to find the python interpreter depending on whether you do $ ./script.py or $ python script.py on the command line is rather confusing.
I might add the register/unregister functionality to my port of virtualenvwrapper: http://bitbucket.org/guillermooo/virtualenvwrapper/src
Thank you! Very helpful. Allowed me to quickly get the MySQLdb binaries into my virtualenv.
Ian Bicking is right. You can install using .exe installer as a source with easy_install. Take a look at my answer to your question on SO -> http://stackoverflow.com/questions/3271590/can-i-install-python-windows-packages-into-virtualenvs/5442340#5442340
Add a comment: