找不到带 imp 的内部模块

Cannot find internal module with imp

在尝试 运行 algolia fork of the mongo_connector 时,我在选择 algolia 文档管理器作为内部模块时遇到了问题。在我看来,其他人都依赖于将文档管理器添加为外部来源,尽管确实没有必要。

为了安装,我创建了这个 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 文件?还尝试了 运行 其他文档管理器,结果相同。

只有当我向文档管理器提供绝对 URL 时,它才有效。

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

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'))