Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I can't import some python libraries (PIL, psycopg2) that I just installed with MacPorts. I looked through these forums, and tried to adjust my PATH variable in ~/.bash_profile in order to fix this but it did not work.

I added the location of PIL and psycopg2 to PATH.
I know that Terminal is using a version of python in /usr/local/bin rather than the one installed by MacPorts at /opt/local/bin.

Do I need to use the MacPorts version of Python in order to ensure that PIL and psycopg2 are on sys.path when I use python in Terminal? Should I switch to the MacPorts version of Python, or will that cause more problems?

In case it is helpful, here are more facts:

PIl and psycopg2 are installed in /opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages

which pythonreturns/usr/bin/python

$ echo $PATHreturns (I separated each path for easy reading):

:/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/
:/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages
:/opt/local/bin
:/opt/local/sbin
:/usr/local/git/bin
:/usr/bin
:/bin
:/usr/sbin
:/sbin
:/usr/local/bin
:/usr/local/git/bin
:/usr/X11/bin
:/opt/local/bin

in python, >>> sys.path returns:

/Library/Frameworks/SQLite3.framework/Versions/3/Python
/Library/Python/2.6/site-packages/numpy-override
/Library/Frameworks/GDAL.framework/Versions/1.7/Python/site-packages
/Library/Frameworks/cairo.framework/Versions/1/Python
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python26.zip
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-darwin
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac/lib-scriptpackages
 /System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-tk
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-old
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynload
/Library/Python/2.6/site-packages
/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC
/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/wx-2.8-mac-unicode

I welcome any criticism and comments, if any of the above looks foolish or poorly conceived. I'm new to all of this. Thanks!

Running OSX 10.6.5 on a MacBook Pro, invoking python 2.6.1 from Terminal

share|improve this question
up vote 5 down vote accepted

Use the 'notes' command after installing python (change python26 to whatever version you installed):

$ port notes python26

You'll see some variation on post install recommendations:

python26 has the following notes:
  To fully complete your installation and make python 2.6 the default,  please
  run:
    sudo port install python_select
    sudo port select python python26

You should install python_select and then select python26 as your default Python. Then, if you did indeed install PIL and pyscopg2 using MacPorts (i.e. something like port install py26-psycopg2 py26-pil), then you shouldn't have to specify anything in PYTHONPATH. You also don't need to add the /opt/local/Library/Frameworks/… directories to your PATH. After doing this, which python should return /opt/local/bin/python. Python ports installed by MacPorts in /opt/local/Library/Frameworks/Python.framework are already in the sys.path for MacPorts Python. You were not finding them earlier because you were using the System Python (i.e. /usr/bin/python), which has no knowledge of MacPorts Python packages.

share|improve this answer
    
Thank you fideli. Just tried it. It was super easy and totally worked. That is the right way to do it. – BenjaminGolder Dec 24 '10 at 7:51
    
Why does macports require that you select this python? Why is it not selected by itself (atleast on my machine, I installed python for the first time under macports; shouldn't it have automatically selected that?) – kalaracey May 13 '12 at 14:45
    
@kalaracey MacPorts attempts to be non-intrusive when there are obvious conflicts, i.e. MacPorts vs System Python. If you would like to use python26 installed through MacPorts, you must select it using python-select. Note that using Python with the full path /opt/local/bin/python2.6 works as well all the time. – fideli May 17 '12 at 4:19
1  
These days it looks like: $ port notes python27 sudo port select --set python python27 – smci Mar 9 '13 at 2:10

I think I figured out the answer to my question. I edited my ~/.bash_profile file to include

export PYTHONPATH=

and then I added all of the existing paths in sys.path:

export PYTHONPATH=/Library/Frameworks/SQLite3.framework/Versions/3/Python:/Library/Python/2.6/site-packages/numpy-override:/Library/Frameworks/GDAL.framework/Versions/1.7/Python/site-packages:/Library/Frameworks/cairo.framework/Versions/1/Python:/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python26.zip:/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6:/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-darwin:/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac:/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac/lib-scriptpackages:/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python:/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-tk:/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-old:/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynload:/Library/Python/2.6/site-packages:/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC:/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/wx-2.8-mac-unicode:/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/:/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages:

and then I appended the paths to the directories where MacPorts installed stuff:

/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/:/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages:

now when I print sys.path, the paths to the MacPorts install directories are included:

/Library/Frameworks/SQLite3.framework/Versions/3/Python
/Library/Python/2.6/site-packages/numpy-override
/Library/Frameworks/GDAL.framework/Versions/1.7/Python/site-packages
/Library/Frameworks/cairo.framework/Versions/1/Python
/Library/Frameworks/SQLite3.framework/Versions/3/Python
/Library/Python/2.6/site-packages/numpy-override
/Library/Frameworks/GDAL.framework/Versions/1.7/Python/site-packages
/Library/Frameworks/cairo.framework/Versions/1/Python
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python26.zip
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-darwin
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac/lib-scriptpackages
/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-tk
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-old
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynload
/Library/Python/2.6/site-packages
/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC
/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/wx-2.8-mac-unicode
/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages

Now

>>> import PIL

and

>>> import psycopg2

work just fine.

share|improve this answer
    
Unfortunately, this doesn't really resolve the issue of having multiple versions of the same library. If there is a library with the same name in two directories, and both are in PATH, how does one know which will be used? – BenjaminGolder Dec 23 '10 at 1:17
    
Found a book on UNIX and shell programming, which said that when given a command the shell will search through the directories in PATH according to the order that they are listed. In other words the first directory listed when you type echo $PATH will be searched first. I assume the same is true of PYTHONPATH. – BenjaminGolder Dec 23 '10 at 2:38

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .