12 comments

[ 2.6 ms ] story [ 30.8 ms ] thread
Cool. I'm surprised this didn't exist earlier.

Now someone upload it to pypi for even more hilarity.

There was (and is) no reason for it to exist since python supports running .zip files that contain all the dependencies.
I had never heard of that, reading up on it now. Thanks for posting!
I was going to mention that an official solution to this problem is around the corner, but the corresponding PEP has been rejected. Anyone know what happened there?

https://peps.python.org/pep-0722/

Fascinating! It looks like PEP 723 (the one that was accepted provisionally) will allow you to embed a comment in your script that looks like this, to specify dependencies on request and rich:

  # /// pyproject
  # [run]
  # requires-python = ">=3.11"
  # dependencies = [
  #   "requests<3",
  #   "rich",
  # ]
  # ///
  
  import requests
  from rich.pretty import pprint
  
  resp = requests.get("https://peps.python.org/api/peps.json")
  data = resp.json()
  pprint([(k, v["title"]) for k, v in data.items()][:10])
A development version of pipx supports a feature that address this pain point. See pull request #916 [1]

In your script example.py, you would specify your dependencies in a special comment like this:

  # Requirements:
  #     requests
  
  import requests
  ...
Then you could run the script like this:

  pipx run file:example.py
This would install the dependencies in a temporary virtual environment, and run the script in that virtual environment.

[1] https://github.com/pypa/pipx/pull/916