2016-02-19 36 views
0

我已经添加目录到我的sys.path数百次之前导入 ,并知道什么期望。我承认,我 没有很多的包装或鸡蛋的经验。奇怪的CPython 2.7导入回溯 - 不是一个ImportError

但是,我有一个有点特别的(显然)是不工作的目录。

回溯,当我尝试导入它,看起来像:

Traceback (most recent call last): 
    File "t", line 17, in <module> 
    from InfinityUnixHost.activities.ICWrap import ICWrap 
    File "/home/dstromberg/PycharmProjects/infinity_PY/src/InfinityUnixHost/activities/ICWrap.py", 
line 8, in <module> 
    from InfinityUnixHost.IPGlobal import DB_POOL 
    File "/home/dstromberg/PycharmProjects/infinity_PY/src/InfinityUnixHost/IPGlobal.py", 
line 12, in <module> 
    INTERNAL_VERSION = pkg_resources.require("InfinityUnixHost")[0].version 
    File "/home/dstromberg/virtualenvs/dev/local/lib/python2.7/site-packages/pkg_resources/__init__.py", 
line 941, in require 
    needed = self.resolve(parse_requirements(requirements)) 
    File "/home/dstromberg/virtualenvs/dev/local/lib/python2.7/site-packages/pkg_resources/__init__.py", 
line 828, in resolve 
    raise DistributionNotFound(req, requirers) 
pkg_resources.DistributionNotFound: The 'InfinityUnixHost' 
distribution was not found and is required by the application 

和产生这个错误一个小测试程序是:

#!/usr/bin/env python 

import sys 
import os.path 

sys.path.insert(0, os.path.abspath('src')) 
sys.path.insert(0, os.path.abspath('eggs/InfinityCore-6-py2.7.egg')) 
#for directory in sys.path: 
#  # print(directory) 
#  if \ 
#      os.path.exists(os.path.join(directory, 
'InfinityUnixHost')) and \ 
#      os.path.exists(os.path.join(directory, 
'InfinityUnixHost/activities')) and \ 
#      os.path.exists(os.path.join(directory, 
'InfinityUnixHost/activities/ICWrap.py')): 
#    print('found in %s' % directory) 

# from InfinityUnixHost.activities.ICWrap import ICWrap 
from InfinityUnixHost.activities.ICWrap import ICWrap 
dummy = ICWrap 

BTW,被注释掉的for循环可以看到我正在尝试导入的文件 (未注释时),但仍然是导入机器不加载 模块。

不幸的是,我无法分享有关InfinityUnixHost内部组件 的很多细节,但我们可以根据需要讨论它。

有谁知道为什么导入在这种奇怪的方式失败?它甚至不是 ImportError!

顺便说一句,我运行测试代码,直到strace,我可以看到它打开ICWrap.py,但它似乎仍然有问题加载到解释器ICWrap.py。

谢谢!

+0

我们在代码中有一些代码:INTERNAL_VERSION = pkg_resources.require(“InfinityUnixHost”)[0] .version。这是否表示这将需要InfinityUnixHost以某种形式的pip-ish方式? – dstromberg

+0

它看起来不完全是导入失败,而是我们不推荐使用pkg_resources.require()的结果。它恰好在导入时被触发,因为它是在模块级完成的。虽然我并不想“小心安装”“缺失”软件包,因为我不想在他们的发行版上工作,而是从我从git中签出的内容上工作...... – dstromberg

回答

0

事实证明,这是因为一些模块级代码正在做一些追溯操作,所以就好像进口机器出了问题。