代码之家  ›  专栏  ›  技术社区  ›  Art

重写python中的命名空间

  •  13
  • Art  · 技术社区  · 15 年前

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

    也许是一些聪明的黑客 初始化 Py?

    补充:

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

    import project
    

    必须正常工作,加载A40BD22344。

    3 回复  |  直到 10 年前
        1
  •  19
  •   krawyoti    15 年前

    你先用 进口 :

    >>> __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
  •  24
  •   Peter Mortensen icecrime    10 年前

    有一种方法可以做到这一点,不需要触摸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()
    

    以下是一些关于 小鬼 模块:

        3
  •  17
  •   Alex Martelli    15 年前

    当然, 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。