2

所以我的第一个 python 程序,我从 PYPI 下载了 macholib 包,然后解压缩并使用 python install 运行安装了 setup.py,现在我正在尝试运行一个程序,我首先导入 macholib,然后当我尝试访问像 Macho 这样的方法,它给了我一个错误,说 macholib 模块没有称为 Macho 的属性。我的理解是 macholib 是一个包而不是模块或其他东西,因此我不能使用包的内容。请回答,我在这么简单的新手问题上浪费了太多时间。使用最新版本的 python 运行 mac。

代码:

import sys
import macholib
MachO(DivXInstaller.dmg) 

我试过 macholib.MachO(DivXInstaller.dmg) 和 macholib.MachO.MachO(DivXInstaller.dmg)

Error for python test.py 
Traceback (most recent call last):
  File "test.py", line 3, in <module>
    MachO(DivXInstaller.dmg)
NameError: name 'MachO' is not defined
4

3 回答 3

5

您的代码中有这一行:

MachO(DivXInstaller.dmg) 

但是,名称 MachO 没有在任何地方定义。所以 Python 会告诉你这个错误

NameError: name 'MachO' is not defined

如果要使用名称为 MachO 的 MachO 模块,则必须导入它:

from macholib import MachO

这是你没有做的,这是你的错误的原因。你所做的只是

import macholib

它为您提供了可以使用的名称“macholib”。但是,macholib 主要包含您无法访问的子模块,因此这并不是特别有用。如果不想污染命名空间,可以将 MachO 导入为

import machlibo.MachO

这使您可以访问 MachO 模块macholib.MachO

你也没有定义DivXInstaller.dmg,所以这将是你的下一个错误。我建议您在开始编程之前先阅读 Python 教程。

于 2012-04-16T09:52:51.057 回答
2

一个 import 语句定义了一个命名空间。因此,为了使用模块或包中定义的东西,您需要对其进行限定。在这种情况下,模块本身是,macholib.MachO但您需要更深入地挖掘,实际上class MachO它具有相同的名称,有点令人困惑,因此您需要import macholib.MachO并使用macholib.MachO.MachO(请注意,当我尝试这样做时,我收到错误“DistributionNotFound: altgraph”,但是)。

进一步注意,它需要一个文件名作为参数,它是一个字符串。此外,您实际上是在创建一个类的实例,所以您可能的意思是

mlib = macholib.MachO.MachO("DivXInstaller.dmg") 

现在 mlib 实际上是您需要通过进一步调用来操作的对象...

或者,您可以这样做from macholib import MachO,甚至from macholib.MachO import MachO可以使用MachO.MachO(...)MachO(...)直接使用。

于 2012-04-16T10:06:17.470 回答
0

如果您了解 Python包模块以及importfrom import ,这将非常简单:

Python 模块只是一个 Python 源文件。

Python 包只是 Python 模块的目录。

1-进口

import package1.package2.module1

要访问 module1 类、函数或变量,您应该使用整个命名空间:package1.package2.modlue1.class1

您不能以这种方式导入类或函数:(错误)

import package1.package2.class1 

2-从...进口

而是使用“from”来导入模块的单个类、函数或变量:

from package1.package2.module1 import class1

无需处理整个命名空间:class1.method1() 现在可以使用

请注意,您不能以这种方式导入类的方法

示例

datetime 是 datetime 模块的一个类,它有一个名为 utcnow() 的方法,访问 utcnow() 可以:

import datetime
datetime.datetime.utcnow()

或者

from datetime import datetime
datetime.utcnow()
于 2013-01-29T20:51:10.400 回答