Частично инициализированный модуль в минимально управляемом пакете Python - PullRequest
1 голос
/ 22 января 2020

У меня есть следующая структура в package dir:

├── bin
│   └── package.py
├── package
│   ├── __init__.py 
│   └── a_file.py
└── setup.py

a_file.py:

def a(): pass

__init__.py:

from .a_file import a

bin/package.py:

#!/usr/bin/env python
from package import a

setup.py:

setup(name='package',
      version='0.1',
      description='',
      url='',
      author='',
      author_email='',
      license='MIT',
      packages=['package'],
      scripts=['bin/package.py'],      
      zip_safe=False)

Я устанавливаю пакет, используя:

pip install -e .

Один раз, когда я запускаю $ package.py из команды строка, ошибка:

ImportError: cannot import name 'a' from partially initialized module 'package' (most likely due to a circular import)

Насколько я понимаю, это явно не циклический импорт. bin/package.py импорт package/a_file.py до package/__init__.py. И package/a_file.py ничего не импортирует.

В чем здесь реальная проблема?

1 Ответ

2 голосов
/ 22 января 2020

bin/package.py импортирует package/a_file.py через package/__init__.py

Нет, bin/package.py импортирует package и Python пытается импортировать любое имя из этого bin/package.py , Это потому, что Python автоматически добавляет каталог скрипта (bin в вашем случае) к sys.path, поэтому любой импорт, связанный с package, импортирует из bin/package.py, а не из package/.

Никогда не называйте ваши скрипты такие же, как существующие пакеты, особенно пакеты из стандартной библиотеки. Никогда не создавайте сценарии email.py, test.py и т. Д.

Переименуйте ваш bin/package.py в package (без расширения) или любое другое имя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...