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