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.
Pichavant<jeanmic...@sequans.com> wrote: > 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.
>>>>> Jean-Michel Pichavant <jeanmic...@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.
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 <p...@cs.uu.nl> URL: http://pietvanoostrum.com [PGP 8DAE142BE17999C4] Private email: p...@vanoostrum.org
>> 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 ?
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 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)