So, I have a python script I’d like to run from time to time from the CLI (on Linux) that resides inside a venv. What’s the recommended/intended way to do this?
Write a wrapper shell script and put it inside a $PATH-accessible directory that activates the virtual environment, runs the python script and deactivates the venv again? This seems a bit convoluted, but I can’t think of a better way.

  • logging_strict
    link
    fedilink
    arrow-up
    1
    ·
    2 months ago

    Thanks for the introduction to taskipy. Think if i need macros, Makefile is the way to go. Supports running targets in parallel and i like performing a check to ensure the virtual environment is activated or the command won’t run.

    .ONESHELL:
    .DEFAULT_GOAL := help
    SHELL := /bin/bash
    APP_NAME := logging_strict
    
    #virtual environment. If 0 issue warning
    #Not activated:0
    #activated: 1
    ifeq ($(VIRTUAL_ENV),)
    $(warning virtualenv not activated)
    is_venv =
    else
    is_venv = 1
    VENV_BIN := $(VIRTUAL_ENV)/bin
    VENV_BIN_PYTHON := python3
    PY_X_Y := $(shell $(VENV_BIN_PYTHON) -c 'import platform; t_ver = platform.python_version_tuple(); print(".".join(t_ver[:2]));')
    endif
    
    .PHONY: mypy
    mypy:					## Static type checker (in strict mode)
    ifeq ($(is_venv),1)
    	@$(VENV_BIN_PYTHON) -m mypy -p $(APP_NAME)
    endif
    
    

    make mypy without the virtualenv on will write a warning message why it’s not working!

    • Andy
      link
      fedilink
      arrow-up
      1
      ·
      edit-2
      2 months ago

      Sure, but nox is the closer counterpart for in-venv-task definitions. List “sessions” with -l, pick specific sessions to run with -s.

      import nox
      from nox.sessions import Session
      
      nox.options.reuse_existing_virtualenvs = True
      APP_NAME = 'logging_strict'
      
      @nox.session(python='3.12')
      def mypy(session: Session):
          """Static type checker (in strict mode)"""
          session.install('-U', 'mypy', '.')
          session.run('mypy',  '-p', APP_NAME, *session.posargs)
      

      Unfortunately it doesn’t currently do any parallel runs, but if anyone wants to track/encourage/contribute in that regard, see nox#544.