Question

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.

Was it helpful?

Solution

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)]

OTHER TIPS

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:

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top