Reputation: 24577
Say there is a folder, '/home/user/temp/a40bd22344'. The name is completely random and changes in every iteration. I need to be able to import this folder in Python using a fixed name, say 'project'. I know I can add this folder to sys.path to enable import lookup, but is there a way to replace 'a40bd22344' with 'project'?
Maybe some clever hacks in init.py?
Added:
It needs to be global - that is, other scripts loading 'project' via the standard:
import project
Have to work properly, loading a40bd22344 instead.
Upvotes: 13
Views: 18128
Reputation: 123508
Here's one way to do it, without touching sys.path, using the imp
module in Python:
import imp
f, filename, desc = imp.find_module('a40bd22344', ['/home/user/temp/'])
project = imp.load_module('a40bd22344', f, filename, desc)
project.some_func()
Here is a link to some good documentation on the imp
module:
Upvotes: 25
Reputation: 20135
You first import it with import:
>>> __import__('temp/a40bd22344')
<module 'temp/a40bd22344' from 'temp/a40bd22344/__init__.py'>
Then you make sure that this module gets known to Python as project
:
>>> import sys
>>> sys.modules['project'] = sys.modules.pop('temp/a40bd22344')
After this, anything importing project in the current Python session will get the original module
>>> import project
>>> project
<module 'temp/a40bd22344' from 'temp/a40bd22344/__init__.py'>
This will work also for sub-modules: if you have a foobar.py in the same location you'll get
>>> import project.foobar
>>> project.foobar
<module 'project.foobar' from 'temp/a40bd22344/foobar.py'>
Addendum. Here's what I'm running:
>>> print sys.version
2.5.2 (r252:60911, Jul 31 2008, 17:28:52)
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)]
Upvotes: 19
Reputation: 881675
Sure, project = __import__('a40bd22344')
after sys.path
is set properly will just work.
Suppose you want to do it in a function taking the full path as an argument and setting the global import of project
properly (as well as magically making import project
work afterwards in other modules). Piece of cake:
def weirdimport(fullpath):
global project
import os
import sys
sys.path.append(os.path.dirname(fullpath))
try:
project = __import__(os.path.basename(fullpath))
sys.modules['project'] = project
finally:
del sys.path[-1]
this also leaves sys.path as it found it.
Upvotes: 17