覆盖Python中的命名空间

时间:2009-07-08 05:20:32

标签: python python-import

假设有一个文件夹'/ home / user / temp / a40bd22344'。该名称是完全随机的,并且每次迭代都会发生变化。我需要能够使用固定名称在Python中导入此文件夹,比如'project'。我知道我可以将此文件夹添加到sys.path以启用导入查找,但有没有办法用'project'替换'a40bd22344'?

也许在 init .py?

中有一些聪明的黑客攻击

补充:

它需要是全局的 - 也就是说,其他脚本通过标准加载'project':

import project

必须正常工作,而是加载a40bd22344。

3 个答案:

答案 0 :(得分:25)

使用Python中的imp模块,这是一种方法,无需触及sys.path:

import imp

f, filename, desc = imp.find_module('a40bd22344', ['/home/user/temp/'])
project = imp.load_module('a40bd22344', f, filename, desc)

project.some_func()

以下是imp模块上一些优秀文档的链接:

答案 1 :(得分:19)

首先使用导入

导入它
>>> __import__('temp/a40bd22344')
<module 'temp/a40bd22344' from 'temp/a40bd22344/__init__.py'>

然后确保Python将此模块称为project

>>> import sys
>>> sys.modules['project'] = sys.modules.pop('temp/a40bd22344')

在此之后,在当前Python会话中导入项目的任何内容都将获得原始模块

>>> import project
>>> project
<module 'temp/a40bd22344' from 'temp/a40bd22344/__init__.py'>

这也适用于子模块:如果你在同一个地方有一个foobar.py

>>> import project.foobar
>>> project.foobar
<module 'project.foobar' from 'temp/a40bd22344/foobar.py'>

附录。以下是我正在运行的内容:

>>> print sys.version
2.5.2 (r252:60911, Jul 31 2008, 17:28:52) 
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)]

答案 2 :(得分:17)

当然,project = __import__('a40bd22344')设置正确后sys.path只会有效。

假设您希望在一个函数中执行此操作,将完整路径作为参数并正确设置全局导入project(以及神奇地使import project工作之后在其他模块中)。一块蛋糕:

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]

这也会在发现它时留下sys.path。