use*_*208 20 python pycharm anaconda python-3.5
假设我有一个非常简单的包,具有以下结构:
.
??? foo
? ??? bar
? ? ??? __init__.py
? ??? __init__.py
??? setup.py
Run Code Online (Sandbox Code Playgroud)
文件内容:
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=''
)
Run Code Online (Sandbox Code Playgroud)foo/bar/__init__.py:
def foobar(x):
return x
Run Code Online (Sandbox Code Playgroud)其余文件为空.
我用以下方法安装包pip:
cd foobar
pip install .
Run Code Online (Sandbox Code Playgroud)
并确认它已正确安装.
现在我想创建一个包含存根文件的独立包:
.
??? foo
? ??? bar
? ? ??? __init__.pyi
? ??? __init__.pyi
??? setup.py
Run Code Online (Sandbox Code Playgroud)
文件内容:
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"]
),
],
)
Run Code Online (Sandbox Code Playgroud)foo.bar.__init__.pyi:
def foobar(x: int) -> int: ...
Run Code Online (Sandbox Code Playgroud)我可以安装这个软件包,看看它是anaconda3/shared/typehints/python3.5/foo/bar/__init__.pyi在我的Anaconda根目录中创建的,但它看起来并不像PyCharm所识别的那样(我没有得到任何警告).当我将pyi文件放在主包中时一切正常.
如果有任何提示如何使这项工作,我将不胜感激:
pathlib部分似乎冒犯了我的版本distutils.PyCharmX.X/config/python-skeletons但它没有帮助.一些有用的东西,但不解决问题:
所以问题是:如何使用Python存根创建一个最小的,可分发的包,这将被现有工具识别.根据实验,我怀疑两个问题之一:
shared/typehints/pythonX.Y- 如果这是真的,我该如何定义data_files?问题是您没有将该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"]
),
],
Run Code Online (Sandbox Code Playgroud)