I am developing a Python application (app), which relies on an internal Python library (lib) that is developed as a separate project. The main application depends on the library via a Git reference (pip install -e git+https://… or equivalent for Poetry). Both app and lib are developed in parallel by the same team.
I am using a multi-root workspace in VS Code for development, and I have created a parent folder in which both projects are checked out in subfolders, and with a product.code-workspace definition file as follows:
{
"folders": [
{ "path": "app" },
{ "path": "lib" }
]
}
lib contains a single file lib/__init__.py:
def hello() -> str:
return "hello world"
app contains the following app/__init__.py:
import lib
def main():
print(lib.hello())
if __name__ == '__main__':
main()
Both projects are set up in their own virtual environment.
When debugging app, how can I tell VS Code to load the actual, live code from the lib subfolder rather than the dependency installed in the virtual environment of app?
In other words, if I change the lib/__init__.py file above to:
def hello() -> str:
return "goodbye"
And run app in VS Code, how do I get it to print the output goodbye instead of hello world without having to commit & push the code changes in lib and reinstalling the dependency in app?
A workaround is to set the PYTHONPATH environment variable in app’s launch.json configuration ("${workspaceFolder}/../lib"). However, I cannot use this because I have multiple project dependencies (lib1, lib2, …) so I would have to assign multiple directories to PYTHONPATH. But unfortunately the syntax for this differs across platform (Windows uses ; as path separator, whereas Linux and macOS use :), and I would prefer having a cross-platform launch configuration that can be fully committed to version control.
I know that you can have joint launch configurations in the workspace (and in fact I am using them!) but I couldn’t find an option here to specify that VS Code should use “live”, local dependencies rather than installed dependencies when launching the application.
For completeness, I have uploaded an MCVE for the two projects to GitHub. To set it up, run:
mkdir test-app && cd $_
git clone [email protected]:klmr/py-test-app app
git clone [email protected]:klmr/py-test-lib lib
cd app
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
Next, add the product.code-workspace configuration from above to the main folder, and launch it in VS Code. Now navigate to lib/lib/__init__.py, edit the function hello to return a different value, and save.
Launch app via F5. It prints hello world, not the changed value.
Pretty sure you can just do this in your launch config:
Note that if you use the play button at the top right, that doesn't use launch configs and you need to use the
terminal.integrated.env.<platform>VS Code settings instead.