打包存根文件

use*_*208 20 python pycharm anaconda python-3.5

假设我有一个非常简单的包,具有以下结构:

.
??? foo
?   ??? bar
?   ?   ??? __init__.py
?   ??? __init__.py
??? setup.py
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文件放在主包中时一切正常.

如果有任何提示如何使这项工作,我将不胜感激:

一些有用的东西,但不解决问题:

  • 将存根文件放在当前项目中并标记为源.
  • 将存根包root添加到解释器路径(至少在一些简单的情况下).

所以问题是:如何使用Python存根创建一个最小的,可分发的包,这将被现有工具识别.根据实验,我怀疑两个问题之一:

  • 我误解了应该由包中创建的结构shared/typehints/pythonX.Y- 如果这是真的,我该如何定义data_files
  • PyCharm根本不考虑这些文件(这似乎与链接问题中的一些评论相矛盾).
  • 它假设工作得很好,但我做了一些配置错误,并寻找不存在的外部问题.
  • 是否有任何既定的程序来解决这样的问题?

mat*_*sko 3

问题是您没有将该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)