setup.py импорт не работает правильно


Я пытаюсь установить простую библиотеку 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 2

3 ответа:

Ваш 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

Ваш foo - это пакет, а пакеты не импортируют модули автоматически. Вы должны сделать это явно. Именно так работает Python. Вы также можете сделать import foo.bar и ссылку foo.bar тогда.

Если вы хотите сделать такую вещь, вы должны заполнить foo/__init__.py с :

import bar

И затем, при импорте foo, вы сможете использовать foo.бар

В противном случае используйте

import foo.bar