Python - 以编程方式按名称导入Python包

时间:2017-11-17 12:40:15

标签: python-2.7

我有几个不同的存储库,我需要以编程方式导入一个具有通用名称的包,例如my_package,e..g /foo/bar/my_package/foo/baz/my_package。我需要能够从这些不同的存储库中检索my_package并将它们保存在单独的变量中。

我尝试使用importlib.import_module执行此操作,但它不起作用 - 我最终使用相同的包变量。

os.chdir('/foo/bar')
foobar_my_package = importlib.import_module('my_package')

os.chdir('/foo/baz')
foobaz_my_package = importlib.import_module('my_package')

> foobar_my_package == foobaz_my_package
> True

我不明白为什么会这样。

1 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情:

import imp

def myImporter(num, p):
    tup = imp.find_module('__init__', [p])
    module = imp.load_module('package%s' % i, *tup)
    tup[0].close()
    return module


if __name__ == '__main__':
    packages =  {}
    for i, p in enumerate(['/tmp/bar/my_package', '/tmp/foo/my_package']):
        _name = 'package%d' % i
        _module = myImporter(i, p)
        packages[_name] = _module

    for k,v in packages.items():
        print (v.__name__, v.main())

对于以下目录结构:

.
├── bar
│   └── my_package
│       └── __init__.py
├── foo
│   └── my_package
│       └── __init__.py

每个__init__.py都有一个main()函数:

def main():
        return "<name>/my_package/main"

它返回:

('package0', 'bar/my_package/main')
('package1', 'foo/my_package/main')