Python 2.7 自定义模块属性错误

Python 2.7 attribute error on custom module

我正在 运行安装了 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 * 没有帮助。

您似乎希望 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)

会起作用。