覆盖命名空间在Python(Override namespace in Python)

2019-06-25 09:42发布

说有一个文件夹,一个 '/ home /用户/温度/ a40bd22344'。 这个名字是完全随机的,在每次迭代变化。 我需要使用一个固定的名字,说“工程”,能够在Python导入此文件夹中。 我知道我可以添加此文件夹的sys.path使进口查找,但有什么办法来取代“a40bd22344”与“工程”?

也许在初始化的.py一些聪明的黑客?

添加:

它需要全球的 - 也就是说,其他脚本通过标准装载“项目”:

import project

要正常工作,加载a40bd22344代替。

Answer 1:

你先用进口导入:

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


Answer 2:

这里有一个办法做到这一点,而不触及sys.path中,使用imp在Python模块:

import imp

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

project.some_func()

下面是对一些好的文档的链接imp模块:

  • 小鬼-访问内部进口


Answer 3:

当然, 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的,因为它发现了它。



文章来源: Override namespace in Python