App Upgrade
It's best practice for users to install python-based CLIs via pipx, where each application gets it's own python virtual environment.
Whether done via pipx or standard pip, updating your application can be done via the upgrade command. i.e.:
$ pipx upgrade mypackage
If you would like your CLI application to be able to upgrade itself, you can add the following command to your application:
import mypackage
import subprocess
import sys
from cyclopts import App
app = App()
@app.command
def upgrade():
"""Update mypackage to latest stable version."""
old_version = mypackage.__version__
subprocess.check_output([sys.executable, "-m", "pip", "install", "--upgrade", "pip"])
subprocess.check_output([sys.executable, "-m", "pip", "install", "--upgrade", "mypackage"])
res = subprocess.run([sys.executable, "-m", "mypackage", "--version"], stdout=subprocess.PIPE, check=True)
new_version = res.stdout.decode().strip()
if old_version == new_version:
print(f"mypackage up-to-date (v{new_version}).")
else:
print(f"mypackage updated from v{old_version} to v{new_version}.")
app()
sys.executable points to the currently used python interpreter's path; if your package was installed via pipx, then it points to the python interpreter in it's respective virtual environment.