【问题标题】:Python 2.7 attribute error on custom module自定义模块上的 Python 2.7 属性错误
【发布时间】:2018-05-18 14:33:50
【问题描述】:

我正在运行安装了 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.vector;那是linalg.linalg.vector
  • 您没有明确指出您将哪个目录添加到 PYTHONPATH - linalg 目录或 python2.7 目录(或两者?或其他?)。
  • 我的 PYTHONPATH 是 '/home/adam/custom-packages/python2.7' 也做 linalg.linalg.vector 再次给我属性错误 AttributeError: 'module' object has no attribute 'linalg'
  • 你没有导入linalg.linalg
  • 不过,您可能应该完全摆脱外部 linalg 包。将linalg.py 拉上一个目录,删除linalg 目录及其__init__.pylinalg.py 将成为linalg 模块。然后您将能够以linalg.vector 的身份访问vector

标签: python module attributes packages


【解决方案1】:

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

会起作用的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    相关资源
    最近更新 更多