Distutils - 我哪里错了?

时间:2010-04-28 16:46:10

标签: python distutils

我想学习如何创建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

我检查了添加到site-packages的文件并检查了控制台中的sys.path,它们似乎没问题。为什么我不能导入Person类。我哪里出错了?

2 个答案:

答案 0 :(得分:4)

person/
   __init__.py
   person.py

你有一个叫person的软件包,里面有一个名为person.person的模块。您在该模块中定义了该类,因此要访问它,您必须说:

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

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

答案 1 :(得分:2)

你的问题不是关于distutils包,而是关于Python包 - 一个相关的但不同的具有相同名称的东西。 Python中的包是一种单独的模块,它是具有__init__.py文件的目录。您创建了一个person包,其中person模块具有Person类。 import person为您提供包裹。如果您希望<{1}}包中的person模块 ,则需要person。如果您希望import person.person包中的Person模块中有person类,则需要person

当你不提供相同名称的不同内容时,以及当你不将类放在单独的模块中时,这些事情会变得更加明显。另请参阅Should I create each class in its own .py file?