打包存根文件

时间:2017-01-28 22:10:36

标签: python pycharm anaconda python-3.5

我们说我的包装非常简单,结构如下:

.
├── 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文件放在主包中时,一切正常。

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

有些可行的方法,但无法解决问题:

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

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

  • 我误解了应该由.PyCharmX.X/config/python-skeletons中的包创建的结构 - 如果这是真的,我该如何定义shared/typehints/pythonX.Y
  • PyCharm根本不考虑这些文件(这似乎与链接问题中的一些评论相矛盾。)
  • 它假设工作正常,但我犯了一些配置错误,并寻找不存在的外部问题。
  • 是否有任何已建立的程序来解决此类问题?

1 个答案:

答案 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"]
    ),
],