自定义模块上的Python 2.7属性错误

时间:2017-12-05 02:15:15

标签: python module attributes packages

我安装了Python 2.7,运行Debian Jessie。我试图创建一个名为linalg.py的小模块,它只包含一些辅助函数。我将带有模块的文件夹添加到PYTHONPATH中,希望它允许我从任何python项目中简单地导入它。 问题是,当我导入它并调用任何函数时,我得到了

AttributeError: 'module' object has no attribute '<xyz>'

我在我的模块目录中添加了__init__.py。树看起来像这样:

custom-packages/
  python2.7/
    linalg/
      linalg.py
      __init__.py

PYTHONPATH包含上面的python2.7目录。 有问题的文件(linalg.py)

import sympy
import numpy as np

from numpy import dot


def vector(*lst):
  return np.array(lst)


def _projection(a, b):
  return sympy.Rational(dot(a, b), dot(b, b)) * b


def projection(a, *b):
  result = np.zeros(len(a))
  for vec in b:
    result += _projection(a, vec)
  return result


def perpendicular(a, *vecs):
  a_hat = projection(a, *vecs)
  return a - a_hat

如果我在python shell上运行以下命令,我会得到属性错误:

>>> import linalg
>>> linalg.vector(1,2,3,4)
AttributeError: 'module' object has no attribute 'vector'

使用from linalg import *没有帮助。

1 个答案:

答案 0 :(得分:0)

您似乎希望linalg.py成为linalg模块,但您实际上已将其作为linalg包的linalg子模块。根据您现在的设置方式,您必须像

那样访问vector
import linalg.linalg

linalg.linalg.vector(1, 2, 3, 4)

但你可能不应该这样做。相反,您应该将linalg.py拉到目录并删除linalg文件夹,这样您的目录结构就像

custom-packages/
  python2.7/
    linalg.py

然后

import linalg

linalg.vector(1, 2, 3, 4)

会奏效。