Setuptools package discovery



我的项目有下面的包树


└── src
|    ├── mypkg1
|    │   ├── module1.py
|    │   ├── module2.py
|    │   └── __init__.py
|    |   |-- setup.py
|    |   |__ requirements.py 
|    └── mypkg2
|        ├── module1.py
|        └── __init__.p
|
|---- base
|      |----- init.py
|      |----- module1.py      

注意- src和base在同一层。

如何配置setup.py文件,以便只安装basemypkg1包,不安装mypkg2包。

我试过在包中提到['base','mypkg1'],但没有工作,也试过使用find_packages(),它只会显示mypkg1mypkg2

由于复杂的代码库布局,有很多事情需要注意。此外,我不确定为什么要在src/mypkg1中显示设置脚本-从那里调用它将找不到src之外的任何内容,因此您将没有机会包括base。在下面的示例中,我切换到同时包含srcbasedirs的根目录:

project_root
├── src/
├── base/
└── setup.py

包发现

由于base在项目根目录下,它将通过普通find_packages调用被发现:

>>> from setuptools import find_packages
>>> find_packages()
['base']

查找src下的包,通过where参数传递:

>>> from setuptools import find_packages
>>> find_packages(where='src')
['mypkg1', 'mypkg2']

要排除mypkg2,通过exclude参数中的列表传递它:

>>> from setuptools import find_packages
>>> find_packages(where='src', exclude=['mypkg2'])
['mypkg1']

包结构映射和文件包含

使用收集的包调用setuptools.setup()只对base有效,因为mypkg1不在根级别。你必须通过package_dir:

映射它的位置
setup(
...,
package_dir={'': 'src'},
)

然而,指示setup()查找src所有包的文件,这使得base下的文件找不到。因此,您必须显式地映射它:

setup(
...,
package_dir={'': 'src', 'base': 'base'},
)

完成最小设置脚本

from setuptools import setup, find_packages
setup(
name='...',
version='...',
packages=find_packages() + find_packages(where='src', exclude=['mypkg2']),
package_dir={'': 'src', 'base': 'base'},
)

现在,当例如构建车轮时,这将产生以下文件布局:

Length      Date    Time    Name
---------  ---------- -----   ----
0  06-24-2022 21:55   base/__init__.py
0  06-24-2022 21:55   base/module1.py
0  06-24-2022 21:54   mypkg1/__init__.py
0  06-24-2022 21:54   mypkg1/module1.py
0  06-24-2022 21:54   mypkg1/module2.py

相关内容

  • 没有找到相关文章

最新更新