2011-04-28 75 views
2

我想安装一个简单的python库,我创建并认为我可能会缺少一个步骤。设置正常(或至少运行),但是当我导入它不工作,因为我期望。 目录结构看起来像setup.py导入不能正常工作


Foo/ 
    setup.py 
    README.txt 
    LICENSE.txt 
    foo/ 
     __init__.py 
     bar.py 

我可以做

>>> import foo

但当时如果我尝试

>>> foo.bar

我收到以下错误

AttributeError: 'module' object has no attribute 'bar'

反之不Ë如果我使用

>>> from foo import bar

rrors发生这里是我的setup.py


from distutils.core import setup 

setup(
    name='Foo', 
    version='0.1.0', 
    author='ctrl-c', 
    author_email='[email protected]', 
    packages=['foo'], 
    license='LICENSE.txt', 
    description='Foo does bar.', 
    long_description=open('README.txt').read(), 
) 

我想我只是错过了一些东西,但我一直在寻找通过文档,并没有发现它。谢谢。

回答

1

你的setup.py显示正常。你如何安装你的软件包?例如:

% cd Foo 
% python setup.py install --root /tmp/fooroot 
% PYTHONPATH=/tmp/fooroot python -c 'from foo import bar; print bar' 
<module 'foo.bar' from 'foo/bar.py'> 

如果你是一个基于RPM的系统上使用你这个可以创建一个可安装RPM:

% python setup.py bdist_rpm 
% sudo rpm -i dist/Foo-0.1.0-1.noarch.rpm 
# now should be available to python globally 

如果你想bar符号可见作为foo属性默认情况下,这样做:

foo/__init__.py

import bar 
+1

将import foo添加到__init__.py正是我所期待的。谢谢 – ctrlc 2011-04-28 16:41:48

+0

这对于大多数包来说都是非常普遍的做法,也就是说我可以'输入numpy'并且在numpy.linalg'没有任何问题。 – ctrlc 2011-04-28 16:49:11

+0

你说得对。许多软件包作者选择从软件包本身导出常用符号。最好将这些模块实现为模块并通过'__init __。py'暴露它们,即不要直接在'__init __。py'中实现类/函数,只是用它来控制哪些符号是包名称空间的一部分。 – samplebias 2011-04-28 16:53:50

1

foo是一个软件包,软件包不会自动导入模块。你必须明确地做。这就是Python的工作原理。然后你也可以做import foo.bar和参考foo.bar

1

,如果你想要做这样的事情,你必须填写的富/ __ init__.py有:

import bar 

然后,导入FOO时,你将能够foo.bar

否则使用,使用

import foo.bar