我有这个包,它遵循 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'
,这是可以理解的。
那么我应该在该字段中输入什么?或者我应该更改项目布局?
您没有提及您正在使用哪个构建后端,但假设它是
setuptools
,那么您目前运气不好。
setuptools
仅支持使用 Python 入口点生成的脚本。这些生成的脚本通过在运行时导入模块并从中运行特定函数来工作。您无法引用运行时不可导入的代码。
目前无法指定文件脚本。
如果您使用poetry作为构建后端,可以使用文件脚本。
目前,仅 Poetry 官方 支持打包脚本的 Python 入口点(就像 setuptools 一样)。但是,诗歌对文件脚本具有非官方支持(请参阅poetry-core#40和poetry#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
。