2010-04-28 2 views
0

Я хотел узнать, как создавать пакеты python, поэтому я посетил http://docs.python.org/distutils/index.html.Distutils - Где я иду не так?

Для этого упражнения я использую Python 2.6.2 для Windows XP.

я следовал вместе с простым примером и создал небольшой тестовый проект:

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 и установил ее в каталог пакетов моих сайтов.

Я запускаю консоль python и могу импортировать модуль пользователя, но я не могу импортировать класс 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

Я думаю, вам нужно будет сделать: 'from person.person import Person' – SilentGhost

ответ

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?