用imp找不到内部模块

时间:2015-02-06 17:58:27

标签: python mongodb pip python-import egg

在尝试运行algolia fork of the mongo_connector时,我遇到了将algolia doc manager选为内部模块的问题。在我看来,其他人都依赖于将文档管理器添加为外部源代码,尽管实际上并不是必需的。

要安装,我已创建此requirement.txt

algoliasearch==1.5.0
elasticsearch==0.4.5
pymongo==2.8
pysolr==3.3.0
requests==2.5.1
urllib3==1.10
wsgiref==0.1.2
git+https://github.com/algolia/mongo-connector.git

并使用sudo pip install -r requirements.txt安装。

然后运行它:

mongo-connector -m mongodb://localhost:5001/meteor -n meteor.items -t credentials-etc:items -o items.txt -d doc_managers/algolia_doc_manager

给我:

 Traceback (most recent call last):
   File "/usr/local/bin/mongo-connector", line 9, in <module>
     load_entry_point('mongo-connector==1.3.dev0', 'console_scripts', 'mongo-connector')()
   File "build/bdist.linux-x86_64/egg/mongo_connector/connector.py", line 720, in main
   File "build/bdist.linux-x86_64/egg/mongo_connector/connector.py", line 77, in __init__
   File "build/bdist.linux-x86_64/egg/mongo_connector/connector.py", line 64, in load_doc_manager
 IOError: [Errno 2] No such file or directory

尝试修复它,我查看了它失败的来源:

def load_doc_manager(path):
    name, _ = os.path.splitext(os.path.basename(path))
    try:
        from importlib.machinery import SourceFileLoader
        loader = SourceFileLoader(name, path)
        module = loader.load_module(name)
    except ImportError:
        module = imp.load_source(name, path)
    return module

因此,当pathdoc_managers/algolia_doc_manager时,为什么imp.load_source()无法在文件存在时找到它?可能是因为包安装为.egg文件?还尝试与其他文档管理员一起运行,结果相同。

只有当我向doc-manager提供绝对URL时,它才有效。

1 个答案:

答案 0 :(得分:1)

我最终以编程方式解析文档管理器路径

import mongo_connector.doc_managers.algolia_doc_manager as doc_manager
import os.path as path, sys

sys.stdout.write(path.join(path.dirname(doc_manager.__file__),'algolia_doc_manager.py'))