如何用诗歌组织Python项目的命令行脚本

时间:2020-06-25 10:12:23

标签: python python-poetry

进行诗歌初始化时,我得到以下结构:

/packagename
  __init__.py
  packagename.py
 /packagename
  /tests
   __init__.py
   test_packagename.py
pyproject.toml

这对于一个程序包来说很好,但是我看不到如何使其适合命令行脚本。 当我有一个具有以下代码结构的脚本:script.py时:

在文件script.py中:

#!/usr/bin/python3

def main():
  print("Ok")

if __name__ == '__main__':
  main()

它不打算用作python模块,但是,它可能具有一些有趣的依赖关系和测试,可以用诗歌来处理。

在某些example中,它显示为具有以下诗歌语法:

[tool.poetry.scripts]
cli_script = 'script.py:main'

然后可以使用以下命令调用脚本:

poetry run cli_script

我正在寻找有关如何正确组织我的诗歌项目以用于此类用途的指南。

例如,我一直在寻找诗歌初始化的选项(例如诗歌初始化--script)。但似乎这种用例并未包含在新的/初始诗歌选项中。

2 个答案:

答案 0 :(得分:1)

通过“诗歌初始化”,我猜你的意思是poetry new。但是,然后您的结构看起来有点怪异。我建议采用以下结构:

packagename
├── packagename
│   ├── __init__.py
│   └── cli.py
├── tests
│   ├── __init__.py
│   └── test_packagename.py
└── pyproject.toml

pyproject.toml看起来像这样:

[tool.poetry]
name = "packagename"
version = "0.1.0"
description = ""
authors = ["finswimmer <finswimmer@example.org>"]

[tool.poetry.scripts]
cli_script = "packagename.cli:main"

[tool.poetry.dependencies]
python = "^3.6"

[tool.poetry.dev-dependencies]
pytest = "^5.2"

[build-system]
requires = ["poetry>=1.0"]
build-backend = "poetry.masonry.api"

cli.py如您的示例:

#!/usr/bin/python3

def main():
  print("Ok")

if __name__ == '__main__':
  main()

poetry install之后,您可以运行poetry run cli_script

答案 1 :(得分:1)

或者你可以运行:

poetry run python3 script.py

哪里:

  • script.py 是具有 python 代码的文件的名称。
  • python3 是诗歌虚拟环境中的 python 可执行文件。这也可以是 python,具体取决于您拥有的 Python 版本。在执行上述命令之前,您可以使用 poetry run python3 -Vpoetry run python -V 进行确认。

这个命令也可以在 crontab 中使用来调度简单的脚本。