2013-06-28 13 views
1

我有一个包含我自己的包util运算符(等等)的python(2.7)项目。我看过relative imports,但也许我不明白。我有以下目录结构:“import numpy”试图加载我自己的包

top-dir/ 
    util/__init__.py (empty) 
    util/ua.py 
    util/ub.py 
    operator/__init__.py 
    ... 

    test/test1.py 

test1.py文件包含

#!/usr/bin/env python2 
from __future__ import absolute_import # removing this line dosn't change anything. It's default functionality in python2.7 I guess 
import numpy as np 

它的优良当我执行test1.pytest/文件夹。但是,当我移动到top-dir/import numpy想包括我自己util包:

Traceback (most recent call last): 
    File "tests/laplace_2d_square.py", line 4, in <module> 
    import numpy as np 
    File "/usr/lib/python2.7/site-packages/numpy/__init__.py", line 137, in <module> 
    import add_newdocs 
    File "/usr/lib/python2.7/site-packages/numpy/add_newdocs.py", line 9, in <module> 
    from numpy.lib import add_newdoc 
    File "/usr/lib/python2.7/site-packages/numpy/lib/__init__.py", line 4, in <module> 
    from type_check import * 
    File "/usr/lib/python2.7/site-packages/numpy/lib/type_check.py", line 8, in <module> 
    import numpy.core.numeric as _nx 
    File "/usr/lib/python2.7/site-packages/numpy/core/__init__.py", line 45, in <module> 
    from numpy.testing import Tester 
    File "/usr/lib/python2.7/site-packages/numpy/testing/__init__.py", line 8, in <module> 
    from unittest import TestCase 
    File "/usr/lib/python2.7/unittest/__init__.py", line 58, in <module> 
    from .result import TestResult 
    File "/usr/lib/python2.7/unittest/result.py", line 9, in <module> 
    from . import util 
    File "/usr/lib/python2.7/unittest/util.py", line 2, in <module> 
    from collections import namedtuple, OrderedDict 
    File "/usr/lib/python2.7/collections.py", line 9, in <module> 
    from operator import itemgetter as _itemgetter, eq as _eq 
ImportError: cannot import name itemgetter 

的麻烦行是

from . import util 

或许

from operator import itemgetter as _itemgetter, eq as _eq 

我能做些什么?

回答

1

operator是Python标准库中的一个模块。为您的模块提供与标准模块相同的名称会引起麻烦,应该避免。

如果你绝对需要一种方法来解决这个问题,你可以尝试玩sys.path变量。第一个元素通常是脚本的目录,或者是将导入系统指向当前目录的空字符串。

oldpath = sys.path.pop(0) 
import numpy 
sys.path.insert(0, oldpath) 
+0

感谢您的回答。不幸的是,他们努力实现相对路径,然后像这样的事情是不能避免的。 – Sebastian