我正在尝试安装一个我创建的简单python库,并认为我可能错过了一步。设置正常(或至少运行),但是当我导入它时,它不能像我期望的那样工作。 目录结构类似于
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
这是我的setup.py
from distutils.core import setup
setup(
name='Foo',
version='0.1.0',
author='ctrl-c',
author_email='10minutemail@10minutemail.com',
packages=['foo'],
license='LICENSE.txt',
description='Foo does bar.',
long_description=open('README.txt').read(),
)
我想我只是错过了一些东西,但我一直在查看文档并且还没有找到它。感谢。
答案 0 :(得分:1)
您的foo
是一个软件包,软件包不会自动导入模块。你必须明确地做。这就是Python的工作原理。您也可以执行import foo.bar
并参考foo.bar
。
答案 1 :(得分: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
答案 2 :(得分:1)
如果你想做这样的事情,你必须填写foo / __ init__.py:
import bar
然后,在导入foo时,您将能够使用foo.bar
否则,请使用
import foo.bar