我的项目有下面的包树
└── 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
文件,以便只安装base
和mypkg1
包,不安装mypkg2
包。
我试过在包中提到['base','mypkg1']
,但没有工作,也试过使用find_packages()
,它只会显示mypkg1
和mypkg2
。
由于复杂的代码库布局,有很多事情需要注意。此外,我不确定为什么要在src/mypkg1
中显示设置脚本-从那里调用它将找不到src
之外的任何内容,因此您将没有机会包括base
。在下面的示例中,我切换到同时包含src
和base
dirs的根目录:
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