VSCode — how to set working directory for debugging a Python program

Question:

How do I run a Python program under debug and set the working directory for the run?

Asked By: user1443098

||

Answers:

You can set up current working directory for debugged program using cwd argument in launch.json

Answered By: Krzysztof Cieslak

Configure the cwd setting in launch.json as follows:

{
    "name": "Python",
    "type": "python",
    "pythonPath": "python", 
    ...
    "cwd": "<Path to the directory>"
    ...
}
Answered By: Don

This setting helps me: (I am a Windows person)

{
  "type": "node",
  "request": "launch",
  "name": "Launch Program",
  "cwd": "${workspaceFolder}\app\js", // set directory here
  "program": "${workspaceFolder}\app\js\server.js", // set start js here
}
Answered By: Xin

@SpeedCoder5’s comment deserves to be an answer.

In launch.json, specify a dynamic working directory (i.e. the directory where the currently-open Python file is located) using:

"cwd": "${fileDirname}"

This takes advantage of the "variables reference" feature in VS Code, and the predefined variable fileDirname.

If you’re using the Python: Current File (Integrated Terminal) option when you run Python, your launch.json file might look like mine, below (more info on launch.json files here).

{
    "version": "0.2.0",
    "configurations": [
    {
            "name": "Python: Current File (Integrated Terminal)",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "cwd": "${fileDirname}"
    }, 

    //... other settings, but I modified the "Current File" setting above ...
}

Remember the launch.json file controls the run/debug settings of your Visual Studio code project; my launch.json file was auto-generated by VS Code, in the directory of my current "Open Project". I just edited the file manually to add "cwd": "${fileDirname}" as shown above.

Remember the launch.json file may be specific to your project, or specific to your directory, so confirm you’re editing the correct launch.json (see comment)

If you don’t have a launch.json file, try this:

To create a launch.json file, open your project folder in VS Code (File > Open Folder) and then select the Configure gear icon on the Debug view top bar.

Per @kbro’s comment, you might be prompted to create a launch.json file by clicking the Debug button itself:

When I clicked on the Debug button on my navigation panel it said "To customise Run and Debug create a launch.json file." Clicking on "create…" opened a dialog asking what language I was debugging. In my case I selected Python

Answered By: Nate Anderson

In some cases, it might be also useful to set the PYTHONPATH along with the workspaceFolder:

{
    "name": "Python: Current File",
    "type": "python",
    "request": "launch",
    "program": "${file}",
    "console": "integratedTerminal",
    "cwd": "${workspaceFolder}",
    "env": {
        "PYTHONPATH": "${cwd}"
    }
}

Answered By: CermakM

I am posting this sample configuration for people who use TypeScript on Node.js

in my project my Node.js server TypeScript files are located in folder Application_ts
and the compiled js files are generated in the folder named Application

because when we run our application in debug mode or start it normally we should start from Application folder which contains the js files
so bellow configuration run debug from root folder where my application_ts also exists and works perfect

{
  "version": "0.2.0",
  "configurations": [
    {
        "type": "node",
        "request": "launch",
        "name": "Debug TypeScript in Node.js",
        "program": "${workspaceRoot}\Application\app.js",
        "cwd": "${workspaceRoot}\Application",
        "protocol": "inspector",
        "outFiles": [],
        "sourceMaps": true
    },        
    {
        "type": "node",
        "request": "attach",
        "name": "Attach to Process",
        "port": 5858,
        "outFiles": [],
        "sourceMaps": true
    }
 ]
}
Answered By: MJ X

To set current working directory to whatever file you are executing at the time:

File > Preferences > Settings > Python > Data Science > Execute in File Dir

Thanks brch: Python in VSCode: Set working directory to python file's path everytime

Answered By: Jake

I faced the same issue and noticed that when running the which python command in Terminal in Mac it shows me a different path to what I get when I run the which python command in vs code. And also that my file runs properly in the terminal when run using python filename.py

So I copied that path from the terminal and pasted it in VS code into Preferences->Settings->Extensions->Python->Default Interpreter Path and it worked. I hope this helps.

Answered By: gkarthik

I use the "justMyCode = false" so I can also debug and jump into the functions that the main script calls.

{
    // Use IntelliSense to learn about possible attributes.    
    // Hover to view descriptions of existing attributes.    
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387    
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "justMyCode": false,
            "cwd": "${fileDirname}"        }
    ]
}
Answered By: Gabriel Felix

In order to make this work globally I had to do the following. Updating only the launch.json file only solves it in the folder where VSCode currently is open.

  1. Locate the settings.json file.

    Windows %APPDATA%CodeUsersettings.json

    macOS $HOME/Library/Application Support/Code/User/settings.json

    Linux $HOME/.config/Code/User/settings.json

  2. Update the file.

{
    // -- other default or custom settings from before

    "python.terminal.executeInFileDir": true,
    "launch": {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "Python: Current File",
                "type": "python",
                "request": "launch",
                "program": "${file}",
                "console": "integratedTerminal",
                "justMyCode": true,
                "cwd": "${fileDirname}",
                "purpose": ["debug-in-terminal"]
            }
        ]}
}

More information here and here.

Answered By: Jakob
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.