如果脚本没有存储在“src”目录中,那么在[project.scripts]表中应该放入什么?

问题描述 投票:0回答:1

我有这个包,它遵循 src 布局:

.
+-- scripts
|   \-- lorem.py
|
+-- src
|   \-- bar
|       |-- __init__.py
|       \-- bazqux.py
|
|-- .editorconfig
|-- .gitignore
|-- LICENSE
|-- pyproject.toml
\-- README.md

pyproject.toml有下表:

[project.scripts]
foo = "bar.lorem:ipsum"

这应该公开一个名为

foo
的命令行可执行文件,如果我理解正确的话,它将运行文件
ipsum
中的函数
./src/bar/lorem.py

但是,我希望我的脚本保留在

scripts
中,它是
src
的兄弟姐妹。
foo = "scripts.lorem:ipsum"
不起作用:它会导致
ModuleNotFoundError: No module named 'scripts'
,这是可以理解的。

那么我应该在该字段中输入什么?或者我应该更改项目布局?

python python-packaging pyproject.toml
1个回答
1
投票

设置工具

您没有提及您正在使用哪个构建后端,但假设它是

setuptools
,那么您目前运气不好。

setuptools
仅支持使用 Python 入口点生成的脚本。这些生成的脚本通过在运行时导入模块并从中运行特定函数来工作。您无法引用运行时不可导入的代码。

目前无法指定文件脚本。

如果您使用poetry作为构建后端,可以使用文件脚本

目前,仅 Poetry 官方 支持打包脚本的 Python 入口点(就像 setuptools 一样)。但是,诗歌对文件脚本具有非官方支持(请参阅poetry-core#40poetry#2310)。

可以通过将

type = "file"
添加到脚本表来指定文件脚本:

[tool.poetry.scripts]
foo = { reference = "scripts/lorem.py", type = "file" }

您应该会看到引用的文件被复制到您的发行版轮文件中的

{name}-{version}.data/scripts
中。

警告一句:虽然使用 pip 安装发行版时可以正确处理文件脚本,但目前 使用

poetry install
时不会处理它们。如果您希望将文件脚本复制到虚拟环境的 bin 目录中,则需要使用
pip install .
而不是
poetry install

© www.soinside.com 2019 - 2024. All rights reserved.