我花了整整两天的时间试图解决这个问题,但没有成功。我有一个python项目想要打包。这是最简单的部分。我不明白的部分是如何将其他多级文件夹复制到包中。
我正在尝试将 myproj 作为与 dosomething.py 的包一起获取,但也有 algorithms 和 configs 文件夹(包含文件夹结构和所有文件)。
项目结构:
- myproj
- src
- myproj
- dosomething.py
- tests
- test_do_something.py
- algorithms
- Type1
- algorithm1
- eval.py
- hyperparameters.yml
- a bunch of other folders and files
- algorithm2
- eval.py
- hyperparameters.yml
- a bunch of other folders and files
- Type2
- algorithm3
- eval.py
- hyperparameters.yml
- a bunch of other folders and files
- algorithm4
- eval.py
- hyperparameters.yml
- a bunch of other folders and files
- configs
- type1.yml
- type2.yml
- pyproject.toml
- mypy.ini
- tox.ini
- run-mypy
pyproject.toml 的内容:
[build-system]
requires = ["setuptools >= 61.0", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "myproj"
version = "0.0.1"
readme = "README.md"
dependencies = [
"numpy >= 1.26.4",
]
[project.urls]
repository = "https://gitlab.com/somerepo
[project.optional-dependencies]
dev = [
"tox",
"pytest",
"pytest-sugar",
"pytest-cov",
"black",
"flake8",
"flake8-docstrings",
"mypy",
"pre-commit",
"sphinx",
"sphinx-rtd-theme"
]
在新的 conda 环境中进行 pip 安装后,我正在寻找以下内容:
- env/test_env/lib/python3.9/site-packages
- myproj
- algorithms and everything under it
- configs and everything under it
- dosomething.py
我已经尝试过 MANIFEST.in,我已经尝试了此页面上的所有内容:https://setuptools.pypa.io/en/latest/userguide/datafiles.html
我认为将整个文件夹和文件复制到包文件夹中是微不足道的,但我被难住了。
任何帮助将不胜感激!
setuptools
自动支持2种标准目录结构,无需额外配置:
src-layout
:总之,无论您在内放置什么内容,src
目录都将在安装过程中复制到site-packages
。flat-layout
:总而言之,项目根目录中直接有一个文件夹(以您希望用户使用的“导入名称”命名),该文件夹本身将在运行期间复制到 site-packages
安装。请注意,在这两种情况下,源代码中的部分目录结构都是在内部模仿的
site-packages
。
在您的示例中,您似乎想要挑选源代码的不同部分,并将它们重新组装到
site-packages
内的不同目录结构中(源代码中没有相同的对应部分)。这是一个不简单的自定义,需要进行额外的配置:
您需要显式设置
tool.setuptools.packages
,因为自动发现无法处理自定义项目布局。可能是这样的(未经测试,可能需要调整):
[tool.setuptools]
packages = ["myproj", "myproj.algorithms", "myproj.configs", ...]
您需要编写all嵌套包。另请注意,Python 所有文件夹都被视为包并且可以导入。即使它们不包含
__init__.py
。
您需要设置
tool.setuptools.package-dir
以将文件“重新映射”/“重新组装”到自定义结构中。可能是这样的(未经测试,可能需要调整):
[tool.setuptools.package-dir]
myproj = "src/myproj"
myproj.algorithms = "algorithms"
myproj.configs = "configs"
(可选)如果你想避免写
MANIFEST.in
,你也可以添加tool.setuptools.package-data
(未经测试,可能需要调整):
[tool.setuptools.package-data]
"" = ["*.yml", ...]
这里
""
(空字符串`是一个特殊值,表示“任何包”)。
这可能非常乏味(并且每次创建新文件夹时都需要更改
pyproject.toml
)。这就是为什么大多数人倾向于“约定优于配置”,并以与普通 src-layout
或 flat-layout
相匹配的方式重新构建项目文件夹。