setuptools: ошибка импорта в load_entry_point - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь создать точку входа при установке моего пакета. Вот мой пакет:

.
├── foo
│   ├── example.py
│   └── __init__.py
└── setup.py

Мой файл setup.py:

import sys
from setuptools import setup, find_packages


console_scripts = \
    ['foo.py = foo.example:main']

setup(name='foo',
      version='1.1.1',
      author='me',
      author_email='me',
      url='',
      entry_points={'console_scripts': console_scripts},
      include_package_data=True,
      packages=find_packages(),
      zip_safe=False)

А это пример.py:

def main():
    print "hello world"

Я устанавливаю так:

python setup.py sdist
pip install dist/foo-1.1.1.tar.gz

Работает нормально. Но когда я пытаюсь использовать точку входа /usr/bin/foo.py, я получаю следующую трассировку:

Traceback (most recent call last):
  File "/usr/bin/foo.py", line 11, in <module>
    load_entry_point('foo==1.1.1', 'console_scripts', 'foo.py')()
  File "/usr/lib/python2.7/site-packages/pkg_resources/__init__.py", line 570, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/usr/lib/python2.7/site-packages/pkg_resources/__init__.py", line 2751, in load_entry_point
    return ep.load()
  File "/usr/lib/python2.7/site-packages/pkg_resources/__init__.py", line 2405, in load
    return self.resolve()
  File "/usr/lib/python2.7/site-packages/pkg_resources/__init__.py", line 2411, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
ImportError: No module named example

Импорт модуля foo в оболочке python также работает нормально.

1 Ответ

0 голосов
/ 13 сентября 2018

Вы назвали свой сценарий точки входа foo.py. При запуске любой импорт из foo импорт из скрипта. То есть вы замаскировали свой пакет foo. В скрипте нет подмодуля example, следовательно, ошибка.

Не называйте сценарий foo.py, назовите его просто foo:

console_scripts = \
    ['foo = foo.example:main']

Или назовите его bar.py, если вам нужно .py расширение. Таким образом, не будет теневого пакета foo.

...