2010-04-28 61 views
0

我想学习如何创建python包,所以我访问了http://docs.python.org/distutils/index.htmlDistutils - 我哪里错了?

对于此练习,我在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,并将其安装到我的站点packages目录中。

我运行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类。我哪里做错了?

+1

我觉得你需要做:'从person.person导入Person' – SilentGhost 2010-04-28 16:50:02

回答

4
person/ 
    __init__.py 
    person.py 

你有一个包叫做person和模块内部叫person.person。您定义的模块中的类,所以要访问它,你不得不说:

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

如果你想要把会员直接在包里面person,你把它们放在__init__.py文件。

2

你的问题是不是真正的distutils包,但对Python包 - 相关,但具有相同名称的不同事情。 Python中的软件包是一种独立的模块,即具有__init__.py文件的目录。您创建了person包,其中person模块包含Person类。 import person为您提供包装。如果您需要person模块内部person包,您需要import person.person。如果您需要person包中的person模块中的Person类,则需要from person.person import Person

这些事情会变得更加明显,当你不给同一个名字给不同的东西时,以及当你不把它们放在单独的模块中为他们自己着想。另见Should I create each class in its own .py file?