【问题标题】:Distutils - Where Am I going wrong?Distutils - 我哪里出错了?
【发布时间】:2010-04-28 16:46:10
【问题描述】:

我想学习如何创建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 类。我哪里做错了?

【问题讨论】:

  • 我认为你需要这样做:from person.person import Person

标签: python distutils


【解决方案1】:
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 模块inside person 包,你需要import person.person。如果你想要 person 模块内的 Person 类在 person 包内,你需要 from person.person import Person

    当你不给不同的东西起相同的名字时,这些事情会变得更加明显,而且当你不为了自己的缘故将类放在单独的模块中时。另见Should I create each class in its own .py file?

    【讨论】: