how to run a script using pyproject.toml settings and poetry?

helpper picture helpper · Dec 11, 2019 · Viewed 15.5k times · Source
  1. I am using poetry to create .whl files.
  2. I have an ftp sever runing on a remote host.
  3. I wrote a python script (log_revision.py) which save in a database the git commit, few more parameters and in the end send the the .whl(that poetry created) to the remote server ( each .whl in a different path in the server, the path is save in the db) .

At the moment I run the script manually after each time I run the poetry build commend. I know the pyproject.toml has the [tool.poetry.scripts] but i dont get how can i use it to run a python script.

I tried

[tool.poetry.scripts]
my-script = "my_package_name:log_revision.py

and then poetry run my-script but I allways get an error AttributeError: module 'my_package_namen' has no attribute 'log_revision'

1. can some one please help me understand how to run to wish commend?

as a short term option(with out git and params) i tried to use the poetry publish -r http://192.168.1.xxx/home/whl -u hello -p world but i get the following error

[RuntimeError]                                 
Repository http://192.168.1.xxx/home/whl is not defined  

2. what am i doing wring and how can i fix it?

would appricate any help, thx!

Answer

finswimmer picture finswimmer · Dec 13, 2019

At the moment the [tool.poetry.scripts] sections is equivalent to setuptools console_scripts.

So the argument must be a valid module and method name. Let's imagine within your package my_package, you have log_revision.py, which has a method start(). Then you have to write:

[tool.poetry.scripts]
my-script = "my_package.log_revision:start"

Here's a complete example:

You should have this folder structure:

my_package
├── my_package
│   ├── __init__.py
│   └── log_revision.py
└── pyproject.toml

The content of pyproject.toml is:

[tool.poetry]
name = "my_package"
version = "0.1.0"
description = ""
authors = ["Your Name <[email protected]>"]

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

[tool.poetry.scripts]
my-script = "my_package.log_revision:start"

[build-system]
requires = ["poetry_core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

and of log_revision.py:

def start():
    print("Hello")

After you have run poetry install once you should be able to do this:

$ poetry run my-script  
Hello

You cannot pass something to the start() method directly. Instead you can use command line arguments and parse them, e.g. with pythons argparse.