13

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

也许init .py中有一些巧妙的技巧?

添加:

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

import project

必须正常工作,改为加载a40bd22344。

4

3 回答 3

25

imp这是使用Python中的模块的一种方法,无需触及 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

于 2009-07-08T05:33:14.457 回答
19

您首先使用 import 导入

>>> __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)]
于 2009-07-08T10:21:15.250 回答
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 ,因为它找到了它。

于 2009-07-08T05:22:28.003 回答