setup.py 导入不正常

2 投票
3 回答
3217 浏览
提问于 2025-04-16 16:35

我正在尝试安装一个我自己创建的简单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(),
)

我想我只是漏掉了什么,但我一直在查阅文档,还没有找到。谢谢。

3 个回答

1

你的 foo 是一个包,而包不会自动导入模块。你必须手动去导入。这就是Python的工作方式。你也可以使用 import foo.bar 来导入,然后就可以使用 foo.bar 了。

1

如果你想做这样的事情,你需要在 foo/__init__.py 文件里填入:

import bar

然后,当你导入 foo 的时候,你就可以使用 foo.bar 了。

否则,你可以使用:

import foo.bar
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

撰写回答