DEV Community

Cover image for Build Command Line Tools with Python Poetry

Build Command Line Tools with Python Poetry

Jonathan Bowman on August 04, 2020

Poetry is a robust and convenient tool for building Python projects. The article Getting Started with Python Poetry demonstrated this in simple ter...
Collapse
 
mklengel profile image
Michael Klengel • Edited

Great article but I have a problem with the scripting part in pyproject.toml:

[tool.poetry.scripts]
greet = "greet.location:cli"
Enter fullscreen mode Exit fullscreen mode

The location of my project folder contains a space and this results in an error:

(.venv) ➜  pygreet greet
zsh: /Volumes/Macintosh SR0/Users/mklengel/Development/pygreet/.venv/bin/greet: bad interpreter: /Volumes/Macintosh: no such file or directory
Enter fullscreen mode Exit fullscreen mode

The question is how to improve the scripting part in pyproject.toml.

Regards
Michael

Collapse
 
bowmanjd profile image
Jonathan Bowman

Interesting. You are right; that space in Macintosh SR0 is causing problems. What version of poetry are you using, and how did you install it?

It looks like your issue was supposed to have been resolved by Poetry Issue 1774, which is why I ask.

Collapse
 
mklengel profile image
Michael Klengel • Edited

Hi Jonathan,

I've detected another bug in conjunction with a space in the path:
Poetry Issue 3630

I've created a new issue:
Poetry Issue 3643

Seems to be insufficient automated testing during the development of poetry.

➜  ~ poetry --version
Poetry version 1.1.4
Enter fullscreen mode Exit fullscreen mode
Thread Thread
 
bowmanjd profile image
Jonathan Bowman

Good job finding the first issue, and logging the other! Are both resolved by #3631, or just the first?

Thread Thread
 
mklengel profile image
Michael Klengel • Edited

Thx - I do my best to learn python so currently I can only help with bug reports :-)
#3631 doesn’t solve the shebang problem, therefore the bug report.

Thread Thread
 
mklengel profile image
Michael Klengel • Edited

Hi Jonathan,

I saw your comment on GitHub. May be I have to check the consequences of renaming the mount paths on my Mac. Should be the practical solution of the problem.

Thread Thread
 
bowmanjd profile image
Jonathan Bowman

What about a symlink? ln -s /Volumes/Macintosh\ SR0/ /HD or something similar? I am not a Mac expert; just pondering.

Thread Thread
 
mklengel profile image
Michael Klengel

The path is already linked:

(.venv) ➜  ~ pwd
/Users/mklengel
(.venv) ➜  ~ ls -l Development 
lrwxr-xr-x  1 mklengel  staff  49 Jan 15 22:03 Development -> /Volumes/Macintosh SR0/Users/mklengel/Development
(.venv) ➜  ~ cd Development/pygreet 
(.venv) ➜  pygreet pwd
/Users/mklengel/Development/pygreet
(.venv) ➜  pygreet poetry shell
Virtual environment already activated: /Volumes/Macintosh SR0/Users/mklengel/Development/pygreet/.venv
Enter fullscreen mode Exit fullscreen mode

poetry "sees" the path but ignores the symbolic link.

Thread Thread
 
bowmanjd profile image
Jonathan Bowman

Michael, what do you think of these steps? Are they a decent, at least temporary, workaround?

sudo ln -s '/Volumes/Macintosh SR0/Users' /homeward
cd /homeward/mklengel/Development/pygreet/
rm -rf .venv
poetry config virtualenvs.in-project false
poetry config virtualenvs.path /homeward/mklengel/Development/.poetryvenv
poetry install
Enter fullscreen mode Exit fullscreen mode

You can adapt names, paths, etc to your liking.

In summary, the above creates a symlink to your users directory (call it homeward or home or whatever you like), then, instead of storing the virtual environment in .venv in the project directory, sets it in poetry's global config to be in a directory of your choosing. Remove the existing .venv in the project, reinstall the project, and it should use the new virtual environment without spaces.

What do you think?

Thread Thread
 
mklengel profile image
Michael Klengel

Hi Jonathan,

thx for your suggestion. The symbolic path exists already:

➜  pygreet ls -ld $HOME/Development/pygreet
drwxr-xr-x  8 mklengel  staff  256  5 Feb 13:38 /Users/mklengel/Development/pygreet
Enter fullscreen mode Exit fullscreen mode

Create the virtualenv inside the project's root directory leads to:

➜  pygreet head -1 .venv/bin/greet
#!/Volumes/Macintosh SR0/Users/mklengel/Development/pygreet/.venv/bin/python
Enter fullscreen mode Exit fullscreen mode

Using the default virtualenv folder looks much better:

➜  pygreet poetry config virtualenvs.in-project false

➜  pygreet poetry config --list
cache-dir = "/Users/mklengel/Library/Caches/pypoetry"
experimental.new-installer = true
installer.parallel = true
virtualenvs.create = true
virtualenvs.in-project = false
virtualenvs.path = "{cache-dir}/virtualenvs"  # /Users/mklengel/Library/Caches/pypoetry/virtualenvs

➜  pygreet poetry install
Creating virtualenv greet-hlYPq_3g-py3.9 in /Users/mklengel/Library/Caches/pypoetry/virtualenvs
Installing dependencies from lock file

Package operations: 24 installs, 0 updates, 0 removals

  • Installing pyparsing (2.4.7)
  • Installing six (1.15.0)
  • Installing appdirs (1.4.4)
  • Installing attrs (20.3.0)
  • Installing click (7.1.2)
  • Installing mccabe (0.6.1)
  • Installing more-itertools (8.6.0)
  • Installing mypy-extensions (0.4.3)
  • Installing packaging (20.9)
  • Installing pathspec (0.8.1)
  • Installing pluggy (0.13.1)
  • Installing py (1.10.0)
  • Installing pycodestyle (2.6.0)
  • Installing pyflakes (2.2.0)
  • Installing python-dateutil (2.8.1)
  • Installing regex (2020.11.13)
  • Installing toml (0.10.2)
  • Installing typed-ast (1.4.2)
  • Installing typing-extensions (3.7.4.3)
  • Installing wcwidth (0.2.5)
  • Installing arrow (0.17.0)
  • Installing black (20.8b1)
  • Installing flake8 (3.8.4)
  • Installing pytest (5.4.3)

Installing the current project: greet (0.1.0)
➜  pygreet head -1 ~/Library/Caches/pypoetry/virtualenvs/greet-hlYPq_3g-py3.9/bin/greet
#!/Users/mklengel/Library/Caches/pypoetry/virtualenvs/greet-hlYPq_3g-py3.9/bin/python

➜  pygreet poetry shell
Spawning shell within /Users/mklengel/Library/Caches/pypoetry/virtualenvs/greet-hlYPq_3g-py3.9

➜  pygreet . /Users/mklengel/Library/Caches/pypoetry/virtualenvs/greet-hlYPq_3g-py3.9/bin/activate

(greet-hlYPq_3g-py3.9) ➜  pygreet greet Africa/Addis_Ababa
Hello, Addis Ababa! The time is 4:50 pm.
Enter fullscreen mode Exit fullscreen mode

So may be this is the bug in poetry: the shebang line is not the symbolic one if the virtualenv folder is in the project's root directory.

Thread Thread
 
bowmanjd profile image
Jonathan Bowman

That's well put.

Collapse
 
jamescarr profile image
James Carr

Thanks, this was really great to catch up on poetry's features and usage.

Collapse
 
bowmanjd profile image
Jonathan Bowman

Glad to hear it was useful! Thanks.

Collapse
 
jermwatt profile image
Jeremy Watt

great article! unblocked me.