0

我想学习如何创建 python 包,所以我访问了http://docs.python.org/distutils/index.html

对于本练习,我在 Windows XP 上使用 Python 2.6.2。

我跟着这个简单的例子创建了一个小测试项目:

person/

    setup.py

    person/
       __init__.py
       person.py

我的 person.py 文件很简单:

class Person(object):   
    def __init__(self, name="", age=0):
        self.name = name
        self.age = age

    def sound_off(self):
        print "%s %d" % (self.name, self.age)

我的 setup.py 文件是:

from distutils.core import setup
setup(name='person',
    version='0.1',
    packages=['person'],
    )

我运行了 python setup.py sdist,它创建了 MANIFEST、dist/ 和 build/。接下来我运行 python setup.py install 并将其安装到我的站点包目录中。

我运行 python 控制台并可以导入 person 模块,但我无法导入 Person 类。

>>>import person
>>>from person import Person
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: cannot import name Person

我检查了添加到站点包的文件并检查了控制台中的 sys.path,它们看起来还可以。为什么我不能导入 Person 类。我哪里做错了?

4

2 回答 2

4
person/
   __init__.py
   person.py

您有一个名为 的包person,其中有一个名为person.person. 您在该模块中定义了类,因此要访问它,您必须说:

import person.person
p= person.person.Person('Tim', 42)

如果您想将成员直接放入包person中,则将它们放入__init__.py文件中。

于 2010-04-28T16:48:59.427 回答
2

你的问题不是关于 distutils 包,而是关于 Python 包——一个相关但不同的同名事物。Python 中的包是一种单独的模块,它们是带有__init__.py文件的目录。您创建了一个person带有person模块的包和一个Person类。import person给你包裹。如果你想要包person模块,你需要. 如果你想要包内模块内的类,你需要.personimport person.personPersonpersonpersonfrom person.person import Person

当你不给不同的东西起相同的名字时,这些事情会变得更加明显,而且当你不为自己的缘故将类放在单独的模块中时。另请参阅我应该在自己的 .py 文件中创建每个类吗?

于 2010-04-28T16:49:33.503 回答