Art*_*Art 13 python python-import
假设有一个文件夹'/ home/user/temp/a40bd22344'.该名称是完全随机的,并且每次迭代都会发生变化.我需要能够使用固定名称在Python中导入此文件夹,比如'project'.我知道我可以将此文件夹添加到sys.path以启用导入查找,但有没有办法用'project'替换'a40bd22344'?
也许在init .py中有一些聪明的黑客攻击?
添加:
它需要是全局的 - 也就是说,其他脚本通过标准加载'project':
import project
Run Code Online (Sandbox Code Playgroud)
必须正常工作,而是加载a40bd22344.
ars*_*ars 25
这是一种方法,使用impPython中的模块,无需触及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()
Run Code Online (Sandbox Code Playgroud)
以下是该imp模块的一些好文档的链接:
kra*_*oti 19
你先用导入进口:
>>> __import__('temp/a40bd22344')
<module 'temp/a40bd22344' from 'temp/a40bd22344/__init__.py'>
Run Code Online (Sandbox Code Playgroud)
然后确保Python知道这个模块project:
>>> import sys
>>> sys.modules['project'] = sys.modules.pop('temp/a40bd22344')
Run Code Online (Sandbox Code Playgroud)
在此之后,在当前Python会话中导入项目的任何内容都将获得原始模块
>>> import project
>>> project
<module 'temp/a40bd22344' from 'temp/a40bd22344/__init__.py'>
Run Code Online (Sandbox Code Playgroud)
这也适用于子模块:如果你在同一个位置有一个foobar.py
>>> import project.foobar
>>> project.foobar
<module 'project.foobar' from 'temp/a40bd22344/foobar.py'>
Run Code Online (Sandbox Code Playgroud)
附录.这是我正在运行的:
>>> print sys.version
2.5.2 (r252:60911, Jul 31 2008, 17:28:52)
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)]
Run Code Online (Sandbox Code Playgroud)
Ale*_*lli 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]
Run Code Online (Sandbox Code Playgroud)
这也会在发现它时留下sys.path.