Python动态加载模块/包冲突

Python动态加载模块/包冲突,python,python-2.7,Python,Python 2.7,我想使用imp.load\u source从源代码中动态加载python(2.7而不是3.x)模块,如果我不将源代码路径附加到sys.path中,本地导入将无法工作。在这种情况下,如何通过本地导入解决模块名称冲突 我已经搜索了一段时间,但找不到解决方案。有什么想法吗?谢谢 我的文件结构如下所示: /tmp |---runner | |-runner.py /tmp/modules |---bundle1 | |--bundle | | |-__init__.py | | |-i

我想使用
imp.load\u source
从源代码中动态加载python(2.7而不是3.x)模块,如果我不将源代码路径附加到
sys.path
中,本地导入将无法工作。在这种情况下,如何通过本地导入解决模块名称冲突

我已经搜索了一段时间,但找不到解决方案。有什么想法吗?谢谢

我的文件结构如下所示:

/tmp
|---runner
|   |-runner.py

/tmp/modules
|---bundle1
|   |--bundle
|   | |-__init__.py
|   | |-index.py
|   |-main.py
|
|---bundle2
    |--bundle
    | |-__init__.py
    | |-index.py
    |-main.py
runner.py中

import os
import imp
import sys

sys.path.append("/tmp/modules/bundle1")
module_a = imp.load_source("Bundle1", "/tmp/modules/bundle1/main.py")
sys.path.append("/tmp/modules/bundle2")
module_b = imp.load_source("Bundle2", "/tmp/modules/bundle2/main.py")

module_a.start()
module_b.start()
from bundle import index
def start():
    index.a_func()

if __name__ == "__main__":
    start()
from bundle import index
def start():
    index.b_func()

if __name__ == "__main__":
    start()
bundle1/main.py中

import os
import imp
import sys

sys.path.append("/tmp/modules/bundle1")
module_a = imp.load_source("Bundle1", "/tmp/modules/bundle1/main.py")
sys.path.append("/tmp/modules/bundle2")
module_b = imp.load_source("Bundle2", "/tmp/modules/bundle2/main.py")

module_a.start()
module_b.start()
from bundle import index
def start():
    index.a_func()

if __name__ == "__main__":
    start()
from bundle import index
def start():
    index.b_func()

if __name__ == "__main__":
    start()
bundle2/main.py中

import os
import imp
import sys

sys.path.append("/tmp/modules/bundle1")
module_a = imp.load_source("Bundle1", "/tmp/modules/bundle1/main.py")
sys.path.append("/tmp/modules/bundle2")
module_b = imp.load_source("Bundle2", "/tmp/modules/bundle2/main.py")

module_a.start()
module_b.start()
from bundle import index
def start():
    index.a_func()

if __name__ == "__main__":
    start()
from bundle import index
def start():
    index.b_func()

if __name__ == "__main__":
    start()

由于bundle中的
冲突
b_func()
bundle2/main.py

中找不到。Python正在缓存一个事实,即它知道一个名为
bundle
的模块以及一个名为
bundle.index
的模块。如果在加载之间打印出
sys.modules['bundle']
,这就不那么神秘了

print sys.modules.get('bundle', None)
# => yields None

sys.path.append("/tmp/modules/bundle1")
module_a = imp.load_source("Bundle1", "/tmp/modules/bundle1/main.py")
print sys.modules.get('bundle', None)
# => <module 'bundle' from '/tmp/modules/bundle1/bundle/__init__.pyc>

sys.path.append("/tmp/modules/bundle2")
module_b = imp.load_source("Bundle2", "/tmp/modules/bundle2/main.py")
print sys.modules.get('bundle', None)
# => <module 'bundle' from '/tmp/modules/bundle1/bundle/__init__.pyc>
请注意,由于您删除了python对bundle1的了解,因此在
del
之后尝试:
moudle_a.start()
将导致
AttributeError


希望这能有所帮助。

这里发生的事情是进口被混为一谈。Python正在缓存一个事实,即它知道一个名为
bundle
的模块以及一个名为
bundle.index
的模块。如果在加载之间打印出
sys.modules['bundle']
,这就不那么神秘了

print sys.modules.get('bundle', None)
# => yields None

sys.path.append("/tmp/modules/bundle1")
module_a = imp.load_source("Bundle1", "/tmp/modules/bundle1/main.py")
print sys.modules.get('bundle', None)
# => <module 'bundle' from '/tmp/modules/bundle1/bundle/__init__.pyc>

sys.path.append("/tmp/modules/bundle2")
module_b = imp.load_source("Bundle2", "/tmp/modules/bundle2/main.py")
print sys.modules.get('bundle', None)
# => <module 'bundle' from '/tmp/modules/bundle1/bundle/__init__.pyc>
请注意,由于您删除了python对bundle1的了解,因此在
del
之后尝试:
moudle_a.start()
将导致
AttributeError


希望这能有所帮助。

我不确定,但也许你应该看看
setuptools
软件包?我不确定,但也许你应该看看
setuptools
软件包?谢谢你的回复。是的,我知道这会混淆系统模块。。。有什么隔离/容器技巧吗?我不知道,除了我上面发布的。不过,你当然可以自己写。也许考虑通过< <代码> > <代码>语法来使用类?谢谢您的响应。是的,我知道这会混淆系统模块。。。有什么隔离/容器技巧吗?我不知道,除了我上面发布的。不过,你当然可以自己写。也许考虑通过< <代码> > < /Cord>语法使用类?