If I have packages installed from easy_install, the eggs are prepended to sys.path
before the items in the PYTHONPATH
variable.
For example, if I have an egg package called foo installed as well as a package called foo in the current directory, and then do this:
PYTHONPATH="." python
>>> import foo
This will use the egg version of foo
instead of the local directory. Inspecting sys.path
shows that eggs are placed before items from PYTHONPATH
. This seems broken. Is there any way to override this behavior?
An egg is a python package. It's a zip archive containing python source files and/or compiled libraries. The format is not well specified about what it must contain or how to make packages for different versions of python and different operating systems, that's one of the reasons it was replaced.
egg-info format: a file or directory placed adjacent to the project's code and resources, that directly contains the project's metadata.
Unfortunately this is done with a hard-coded template deep inside setuptools/command/easy_install.py
. You could create a patched setuptools with an edited template, but I've found no clean way to extend easy_install from the outside.
Each time easy_install runs it will regenerate the file easy_install.pth
. Here is a quick script which you can run after easy_install, to remove the header and footer from easy_install.pth
. You could create a wrapper shell script to run this immediately after easy_install
:
#!/usr/bin/env python
import sys
path = sys.argv[1]
lines = open(path, 'rb').readlines()
if lines and 'import sys' in lines[0]:
open(path, 'wb').write(''.join(lines[1:-1]) + '\n')
Example:
% easy_install gdata
% PYTHONPATH=xyz python -c 'import sys; print sys.path[:2]'
['', '/Users/pat/virt/lib/python2.6/site-packages/gdata-2.0.14-py2.6.egg']
% ./fix_path ~/virt/lib/python2.6/site-packages/easy_install.pth
% PYTHONPATH=xyz python -c 'import sys; print sys.path[:2]'
['', '/Users/pat/xyz']
For more clarification, here is the format of easy-install.pth
:
import sys; sys.__plen = len(sys.path)
./gdata-2.0.14-py2.6.egg
import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)
The two import sys
lines are the culprit causing the eggs to appear at the start of the path. My script just removes those sys.path
-munging lines.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With