views:

81

answers:

3

One of my Python scripts runs in interactive mode but fails when run from the command line. The difference is that when run from the command line, it imports modules from a bad .egg file, and when run interactively it uses my fixed (unzipped) version in the current directory.

My question is two-fold: a) why does Python load modules differently when run from these locations, and b) what are my options to work around it?

+1  A: 

On UNIX systems and Mac OS-X:

  • Do you have a ~/.python-eggs directory?

OS independent:

  • Are you sure that you use the same Python instance in both cases?

  • Can you print sys.path in each cases and see which package directory comes first on your module search path?

fviktor
Thanks fviktor. I don't have a ~/.python-eggs directory, but it was a PYTHONPATH issue. Since adding the unzipped version to my path didn't resolve this (as the .egg files were still loading first), I just deleted the .egg.
Dan
Now I remember. I had similar issues before when I had to fix a Trac extension installed from an egg file. Installing that egg package in uncompressed form allowed me to change the source code in that package after installation. But yes, the egg file has to be removed from the site-packages directory as you mentioned above, otherwise it has precedence over the decompressed source tree.You can install eggs in decompressed form this way:easy_install.py --always-unzip package_to_install.eggDocumentation:easy_install --help
fviktor
+1  A: 

I don't understand what do you mean by running script in interactive mode, so I can't say exactly. But the first place to look for modules (sys.path[0]) in interactive mode is current directory (even calling os.chdir() will affect imports), while for script it's directory where the script is located (derived from sys.argv[0]). Note that they are effectively the same when script is run from directory where it's located, but could be different in other cases. Hope this helps.

Denis Otkidach
Thanks Denis. This turned out to be the issue—see my comments below.
Dan
+1  A: 

a) why does Python load modules differently when run from these locations b) what are my options to work around it?

Check your environment variable PYTHONPATH. When python imports module, it searches those directories. One way to get around your problem is to add your local folder "the (unzipped) version in the current directory" to the beginning of PYTHONPATH so that python will find it first.

LNK2019
Thanks, LNK2019. Even adding the local unzipped version to the PYTHONPATH didn't solve the issue, as the .egg files were coming before the PYTHONPATH I set in my .profile. Deleting the bad .egg file outright took care of it, though.
Dan