5

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?

Dan
  • 1,677
  • 5
  • 19
  • 34
  • do the interactive sessions run in plain python or in IPython? The latter may have different PYTHONPATH and importing rules. – Boris Gorelik Nov 22 '09 at 07:44

4 Answers4

3

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
  • 32,032
  • 8
  • 79
  • 100
2

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
  • 2,861
  • 20
  • 24
  • 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 Nov 23 '09 at 01:31
  • 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.egg Documentation: easy_install --help – fviktor Nov 23 '09 at 03:00
1

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
  • 685
  • 1
  • 6
  • 13
  • 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 Nov 23 '09 at 01:31
0

This works for me:

import sys

sys.path[0]=''
Eric Aya
  • 69,473
  • 35
  • 181
  • 253
Dima
  • 1