我们说我的包装非常简单,结构如下:
.
├── 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: ...
我可以安装这个软件包,看看它在我的Anaconda根目录中创建了anaconda3/shared/typehints/python3.5/foo/bar/__init__.pyi
,但它看起来并不像PyCharm所识别的那样(我没有得到任何警告)。当我将pyi
文件放在主包中时,一切正常。
如果有任何提示如何使这项工作,我将不胜感激:
pathlib
部分似乎也冒犯了我的distutils
有些可行的方法,但无法解决问题:
所以问题:如何使用Python存根创建一个最小的,可分发的包,这将被现有工具识别。根据实验,我怀疑有两个问题之一:
.PyCharmX.X/config/python-skeletons
中的包创建的结构 - 如果这是真的,我该如何定义shared/typehints/pythonX.Y
?答案 0 :(得分:2)
问题是您未在存根分发中包含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"]
),
],