打包存根文件

2024-04-26 19:08:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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

.
├── 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: ...
    

{看不出这个包是什么意思,但我无法识别它。当我把pyi文件放在主包中时,一切正常。在

如果您能给我一些建议,我将不胜感激:

有些方法可行,但不能解决问题:

  • 将存根文件放入当前项目并标记为源文件。在
  • 在某些情况下,将存根路径添加到包中(至少在某些情况下)。在

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

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

Tags: 文件pyimportfooinitversionsetupbar
1条回答
网友
1楼 · 发布于 2024-04-26 19:08:03

问题是您没有在存根发行版中包含foo/__init__.pyi文件。即使它是空的,它使foo成为一个存根文件包,并启用对foo.bar的搜索。在

您可以修改data_files中的data_files,以将两者都包含进来

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

相关问题 更多 >