Упаковочные заглушки
Скажем, у меня очень простой пакет со следующей структурой:
.
├── foo
│ ├── bar
│ │ └── __init__.py
│ └── __init__.py
└── setup.py
Содержимое файлов:
-
setup.py
:
from distutils.core import setup
setup(
name='foobar',
version='',
packages=['foo', 'foo.bar'],
url='',
license='Apache License 2.0',
author='foobar',
author_email='',
description=''
)
-
foo/bar/__init__.py
:
def foobar(x):
return x
-
Остальные файлы пустые.
Я устанавливаю пакет с помощью pip
:
cd foobar
pip install .
и может подтвердить, что он установлен правильно.
Теперь я хочу создать отдельный пакет с заглушками:
.
├── foo
│ ├── bar
│ │ └── __init__.pyi
│ └── __init__.pyi
└── setup.py
Содержимое файлов:
-
setup.py
:
from distutils.core import setup
import sys
import pathlib
setup(
name='foobar_annot',
version='',
packages=['foo', 'foo.bar'],
url='',
license='Apache License 2.0',
author='foobar',
author_email='',
description='',
data_files=[
(
'shared/typehints/python{}.{}/foo/bar'.format(*sys.version_info[:2]),
["foo/bar/__init__.pyi"]
),
],
)
-
foo.bar.__init__.pyi
:
def foobar(x: int) -> int: ...
Я могу установить этот пакет, увидеть, что он создает anaconda3/shared/typehints/python3.5/foo/bar/__init__.pyi
в моем корневом каталоге Anaconda, но не похоже, что он распознан PyCharm (я не получаю никаких предупреждений). Когда я помещаю pyi
файл в основной пакет, все работает нормально.
Буду благодарен за любые подсказки, как сделать эту работу:
Некоторые вещи, которые работают, но не решают проблему:
- Включение файлов-заглушек в текущий проект и маркировка в качестве источников.
- Добавление корня заглушки в путь интерпретатора (по крайней мере, в некоторых простых случаях).
Итак, вопросы: Как создать минимальный дистрибутивный пакет с заглушками Python, который будет распознаваться существующими инструментами. На основании экспериментов я подозреваю одну из двух проблем:
- Я неправильно понял структуру, которая должна быть создана пакетом в
shared/typehints/pythonX.Y
- если это так, как мне определить data_files
?
- PyCharm не рассматривает эти файлы вообще (это, кажется, противоречит некоторым комментариям в связанной проблеме).
- Предположим, что все работает нормально, но я допустил некоторую ошибку конфигурации и искал внешнюю проблему, которая не существует.
- Существуют ли установленные процедуры для устранения таких проблем?
Ответы
Ответ 1
Проблема заключается в том, что вы не включили файл foo/__init__.pyi
в свой дистрибутив. Несмотря на то, что он пуст, он делает foo
пакет заглушек и включает поиск foo.bar
.
Вы можете изменить data_files
в своем setup.py
, чтобы включить оба
data_files=[
(
'shared/typehints/python{}.{}/foo/bar'.format(*sys.version_info[:2]),
["foo/bar/__init__.pyi"]
),
(
'shared/typehints/python{}.{}/foo'.format(*sys.version_info[:2]),
["foo/__init__.pyi"]
),
],