在平面布局中发现多个顶级包

Multiple top-level packages discovered in a flat-layout

提问人:Rodrigo 提问时间:5/19/2022 最后编辑:Rodrigo 更新时间:7/21/2023 访问量:34134

问:

我正在尝试从使用 Poetry 的源代码安装一个库,但我收到此错误

error: Multiple top-level packages discovered in a flat-layout: ['tulips', 'fixtures'].
        
To avoid accidental inclusion of unwanted files or directories,
setuptools will not proceed with this build.
        
If you are trying to create a single distribution with multiple packages
on purpose, you should not rely on automatic discovery.
Instead, consider the following options:
        
1. set up custom discovery (`find` directive with `include` or `exclude`)
2. use a `src-layout`
3. explicitly set `py_modules` or `packages` with a list of names
        
To find more information, look for "package discovery" on setuptools docs

我需要做些什么来修复它?

python-poetry

评论

0赞 Alexander 5/19/2022
您的目录结构是什么样的?
0赞 Rodrigo 5/19/2022
@alexpdev我正在尝试从 GitHub tar 直接使用这个库.gz github.com/woocart/tulips
0赞 Alexander 5/19/2022
然后,您应该将库放在您的目录中或存储其他包的任何位置site-packages
0赞 0dminnimda 5/19/2022
tulip似乎是带有 python 绑定的 C++ 库,但它的配置方式不正确,看起来,看这里

答:

56赞 Warm_Duscher 6/8/2022 #1

根据对 GitHub 问题的此评论,将以下行添加到 your 可能会解决您的问题:pyproject.toml

[tool.setuptools]
py-modules = []

(就我而言,该注释中提供了其他解决方法,即将作为关键字参数添加到 worked 中的 setup() 函数)py_modules=[]setup.py

评论

10赞 András Aszódi 8/22/2022
错误消息甚至说“3.明确设置或带有名称列表”。在我的情况下,指定 in 是解决方案(我有另一个在同一级别的目录,令人困惑)。py_modulespackagespackages = ["my_pkg_name"][tool.setuptools]pyproject.tomlsetuptools
4赞 Martin Spacek 11/15/2022
请注意,这是一条错误消息,可能于 2022 年 3 月开始出现在 setuptools 版本 61.0.0 (setuptools.pypa.io/en/latest/history.html#v61-0-0) 中。Ubuntu 20.04 附带安装了 45.2.0 版本,似乎 22.04 附带了 59.6.0,因此此错误将来会开始更频繁地出现。此外,为了澄清,解决方法要求将其作为关键字参数添加到函数中。py_modules=[]setup()
0赞 AstroFloyd 10/8/2023
你会认为,如果其中一个“令人困惑”的选项是软件包名称,那么它就不会那么令人困惑......
0赞 AstroFloyd 11/5/2023
py-modules = [] 似乎对我有用,但结果并没有包含我的 Python 文件(仅限元数据)。替换它似乎更好。packages = ["<package name>"]
4赞 Charalamm 7/21/2023 #2

添加以下内容对我有用。这是一个包含许多文件夹的存储库,但只有一个文件夹包含包代码:pyproject.toml

[tool.setuptools.packages.find]
where = ["."]  # list of folders that contain the packages (["."] by default)
include = ["<package name>"]  # package names should match these glob patterns (["*"] by default)
exclude = []  # exclude packages matching these glob patterns (empty by default)
namespaces = false  # to disable scanning PEP 420 namespaces (true by default)