代码之家  ›  专栏  ›  技术社区  ›  RyanBrady

distutils-我哪里做错了?

  •  0
  • RyanBrady  · 技术社区  · 16 年前

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

    在本练习中,我将在WindowsXP上使用Python2.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并将其安装到我的site 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类。我哪里做错了?

    2 回复  |  直到 16 年前
        1
  •  4
  •   bobince    16 年前
    person/
       __init__.py
       person.py
    

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

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

    如果要将成员直接放入包中 ,你会把它们放在 __init__.py 文件。

        2
  •  2
  •   Community Mohan Dere    9 年前

    你的问题并不是关于distutils包,而是关于python包——一个相关的 但不一样 同名的东西。python中的包是一种独立的模块,它是带有 __init__.py 文件。你创造了一个 person 用一个 带有 Person 班级。 import person 把包裹给你。如果你想 模块 里面 这个 包裹,你需要 import person.person . 如果你想 类内部 模块内部 包裹,你需要 from person.person import Person .

    当你不给不同的东西取同一个名字,也不为了它们自己的缘故把类放在不同的模块中时,这些事情变得更加明显。也看到 Should I create each class in its own .py file?

    推荐文章