Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

doted filenames in import statements

7 views
Skip to first unread message

Jean-Michel Pichavant

unread,
Jul 21, 2009, 5:42:41 PM7/21/09
to Python List
Hi fellows,

I'd like to use the dynamic __import__ statement. It works pretty well
with non dotted names, but I cannot figure how to make it work with
dotted file paths.

example:

file = "/home/dsp/test.py"
test = __import__(file)

works like a charm

file = "/home/dsp/4.6.0.0/test.py"
test = __import__(file)
=> no module name blalalal found.

Any suggestion ? I tried multiple escape technics without any success.

JM

Chris Rebert

unread,
Jul 21, 2009, 5:59:17 PM7/21/09
to Jean-Michel Pichavant, Python List

You want the imp.load_module() function:
http://docs.python.org/library/imp.html#imp.load_module

__import__() only operates on module/package names. I'm not sure how
you even got it to work with a filename...

Cheers,
Chris
--
http://blog.rebertia.com

Piet van Oostrum

unread,
Jul 21, 2009, 6:29:52 PM7/21/09
to
>>>>> Jean-Michel Pichavant <jeanm...@sequans.com> (JP) wrote:

>JP> Hi fellows,
>JP> I'd like to use the dynamic __import__ statement. It works pretty well with
>JP> non dotted names, but I cannot figure how to make it work with dotted file
>JP> paths.

What is a dotted file path? Is that 4.6.0.0?

>JP> example:

>JP> file = "/home/dsp/test.py"
>JP> test = __import__(file)

>JP> works like a charm

That's not supposed to work. In older pythons it did work but that's a
bug. In newer pythons it doesn't. __import__ works on module names, not
on file names.

Python 2.6:

>>> spam = __import__('/Users/piet/TEMP/test.py', globals(), locals(), [], -1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: Import by filename is not supported.
>>>

>JP> file = "/home/dsp/4.6.0.0/test.py"
>JP> test = __import__(file)
>JP> => no module name blalalal found.

>JP> Any suggestion ? I tried multiple escape technics without any success.

Rightly so.

I think the best would be to add the directory to sys.path
sys.path.add('/home/dsp/4.6.0.0')
and then
__import__('test', ... )
--
Piet van Oostrum <pi...@cs.uu.nl>
URL: http://pietvanoostrum.com [PGP 8DAE142BE17999C4]
Private email: pi...@vanoostrum.org

Christian Heimes

unread,
Jul 21, 2009, 6:48:40 PM7/21/09
to pytho...@python.org
Chris Rebert wrote:
> You want the imp.load_module() function:
> http://docs.python.org/library/imp.html#imp.load_module
>
> __import__() only operates on module/package names. I'm not sure how
> you even got it to work with a filename...

It used to work with filenames but it was a bug. I guess several people
are swearing curses on me for removing this 'feature'. *g*

Christian

Jean-Michel Pichavant

unread,
Jul 22, 2009, 8:16:19 AM7/22/09
to Piet van Oostrum, pytho...@python.org
Piet van Oostrum wrote:
>
> [snip]

>
>> JP> file = "/home/dsp/4.6.0.0/test.py"
>> JP> test = __import__(file)
>> JP> => no module name blalalal found.
>>
>
>
>> JP> Any suggestion ? I tried multiple escape technics without any success.
>>
>
> Rightly so.
>
> I think the best would be to add the directory to sys.path
> sys.path.add('/home/dsp/4.6.0.0')
> and then
> __import__('test', ... )
>

I see. My problem is that a have to import 2 different files having de
same name. In the same name space I have 2 objects from 2 different
software branches, let's say 4.6.0 and 4.6.1.
The first object shall import 4.6.0/orb.py and the second one 4.6.1/orb.py.

If I add 4.6.1 to sys.path, the import statement will look like:
self._orb = __import__('orb')
The problem is, python wil assume orb is already imported and will
assign the module from the 4.6.0 branch to my 4.6.1 object.

Do I have to mess up with sys.modules keys to make python import the
correct file ? Is there a standard/proper way to do that ?

JM

Terry Reedy

unread,
Jul 22, 2009, 12:44:08 PM7/22/09
to pytho...@python.org
Jean-Michel Pichavant wrote:
> Piet van Oostrum wrote:
>>
>> [snip]
>>
>>> JP> file = "/home/dsp/4.6.0.0/test.py"
>>> JP> test = __import__(file)
>>> JP> => no module name blalalal found.
>>>
>>
>>
>>> JP> Any suggestion ? I tried multiple escape technics without any
>>> success.
>>>
>>
>> Rightly so.
>>
>> I think the best would be to add the directory to sys.path
>> sys.path.add('/home/dsp/4.6.0.0')
>> and then
>> __import__('test', ... )
>
> I see. My problem is that a have to import 2 different files having de
> same name. In the same name space I have 2 objects from 2 different
> software branches, let's say 4.6.0 and 4.6.1.
> The first object shall import 4.6.0/orb.py and the second one 4.6.1/orb.py.
>
> If I add 4.6.1 to sys.path, the import statement will look like:
> self._orb = __import__('orb')
> The problem is, python wil assume orb is already imported and will
> assign the module from the 4.6.0 branch to my 4.6.1 object.
>
> Do I have to mess up with sys.modules keys to make python import the
> correct file ? Is there a standard/proper way to do that ?

If you make the directory names into proper identifiers like v460 and
v461 and add __init__.py to each to make them packages and have both on
search path, then

import v460.orb #or import v460.orb as orb460
import v461.orb #or import v460.orb as orb461

will get you both. One way or another, they have to get different names
within Python.

Terry Jan Reedy

Jean-Michel Pichavant

unread,
Jul 24, 2009, 8:34:23 AM7/24/09
to Terry Reedy, pytho...@python.org
Terry Reedy wrote:
> Jean-Michel Pichavant wrote:
>> Piet van Oostrum wrote:
>>>
>>> [snip]
>>>
>>>> JP> file = "/home/dsp/4.6.0.0/test.py"
>>>> JP> test = __import__(file)
>>>> JP> => no module name blalalal found.
>>>
>>>
>>>> JP> Any suggestion ? I tried multiple escape technics without any
>>>> success.
>>>
>>> Rightly so.
>>>
>>> I think the best would be to add the directory to sys.path
>>> sys.path.add('/home/dsp/4.6.0.0')
>>> and then
>>> __import__('test', ... )
>>
>> I see. My problem is that a have to import 2 different files having
>> de same name. In the same name space I have 2 objects from 2
>> different software branches, let's say 4.6.0 and 4.6.1.
>> The first object shall import 4.6.0/orb.py and the second one
>> 4.6.1/orb.py.
>>
>> If I add 4.6.1 to sys.path, the import statement will look like:
>> self._orb = __import__('orb')
>> The problem is, python wil assume orb is already imported and will
>> assign the module from the 4.6.0 branch to my 4.6.1 object.
>>
>> Do I have to mess up with sys.modules keys to make python import the
>> correct file ? Is there a standard/proper way to do that ?
>
> If you make the directory names into proper identifiers like v460 and
> v461 and add __init__.py to each to make them packages and have both
> on search path, then
>
> import v460.orb #or import v460.orb as orb460
> import v461.orb #or import v460.orb as orb461
>
> will get you both. One way or another, they have to get different
> names within Python.
>
> Terry Jan Reedy
>

I finally had to write my own import statement as I prefered to
manipulate the python objects instead of manipulating third party files.
Basically when importing 'file.py' it records it in sys.modules as
sys.modules['__magic_word_file''] and then I remove the standard
reference. This allows me to import file.py again, but with a totally
different path. (path is temporarily added to sys.path)

JM

0 new messages