Strange __import__() behavior

Frank Miles fpm at u.washington.edu
Thu Apr 26 11:19:12 EDT 2012


On Wed, 25 Apr 2012 23:03:36 +0200, Kiuhnm wrote:

> On 4/25/2012 22:05, Frank Miles wrote:
>> I have an exceedingly simple function that does a "named import". It
>> works perfectly for one file "r"- and fails for the second "x".
>>
>> If I reverse the order of being called, it is still "x" that fails, and
>> "r" still succeeds.
>>
>> os.access() always reports that the file is readable (i.e. "true")
>>
>> If I simply call up the python interpreter (python 2.6 - Debian stable)
>> and manually "import x" - there is no problem - both work.  Similarly
>> typing the __import__("x") works when typed directly at the python
>> prompt.  Both 'x' and 'r' pass pychecker with no errors.  The same
>> error occurs with winpdb - the exception message says that the file
>> could not be found.  'file' reports that both files are text files, and
>> there aren't any strange file-access permissions/attributes.
>>
>> Here's the function that is failing:
>>
>> def named_import(fname, description) :
>>      import  os
>>      pname= fname + '.py'
>>      print "ENTRY FILE", pname, ": acces=", os.access(pname, os.R_OK)
>>      try :
>>          X=__import__(fname)
>>          x= [ X.cmnds, X.variables ]
>>      except ImportError :
>>          print "failed"
>>      return x
>>
>> This is the first time I've needed to import a file whose name couldn't
>> be specified in the script, so there's a chance that I've done
>> something wrong, but it seems very weird that it works in the CL
>> interpreter and not in my script.
>>
>> TIA for any hints or pointers to the relevant overlooked documentation!
> 
> I can't reproduce your problem on my configuration. Anyway, you should
> note that if x.pyc and r.pyc are present, __import__ will try to import
> them and not the files x.py and r.py. Try deleting x.pyc and r.pyc.
> 
> Kiuhnm

You are fast in replying!  I nuked my query (within a few minutes of 
posting) when I discovered the reason.  Perhaps it persisted in some
domain.

I'd forgotten that the python script containing the described function was
not the file itself, but a link to the script.  When I executed the script
(er, link to the script) - even with winpdb - apparently __import__ 
examined the directory where the actual file resided.  In _that_ 
directory, only 'r' existed, no 'x'.

So thanks for trying, there was no way you (or anyone) could have seen 
that the script was just a link to a script...

   -F



More information about the Python-list mailing list