How do I execute a Python file with the debugger and specify the working directory for the run?
Setting "cwd"
to ${FileDirname}
in launch.json did not work for me; rather, I tried modifying settings.json, and actually got a solution.
In the settings.json file, add the field:
"python.terminal.executeInFileDir": true
After adding this field, my settings.json looks something like:
{
"python.terminal.executeInFileDir": true
}
This will definitely set the cwd to the directory that contains your file, as opposed to the root folder of the project.
@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/variable substitution" feature in VS Code, and the predefined variable fileDirname
. Note these variables are case sensitive. Don't use capital-F FileDirname
, and be careful of typo's, which might be the problem with answers like these.
Note as comments say, you might also need to add the purpose
option:
"purpose": ["debug-in-terminal"]
"Purpose" might be required if using the play button on the top-right of the window, vs F5 or "Run and Debug" in the sidebar.
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}",
"purpose":["debug-in-terminal"]
},
//... other settings, but I modified the "Current File" setting above ...
}
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.
Note 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
launch.json
locally and copy that information in each time you're creating a new launch.json –
Fardel "purpose":["debug-in-terminal"]
in launch.json –
Bucket "purpose"
attribute in the launch.json file, this link describes it in more detail I don't know why the "purpose"
attribute is not mentioned in the launch.json
attributes documentation. I would edit my answer to mentioned "purpose"
, but I haven't tested it and I worry about comments like "Note: The purpose option can't be used to start the debugger through F5 or Run > Start Debugging" –
Berck cwd
alone didn't work for me, adding purpose did the trick. VSCode 1.80.1 on linux. –
Hallvard "purpose": ["debug-in-terminal"]
to the answer –
Berck "purpose"
isn't needed if you use 'F5' or use the "Run And Debug" sidebar, but is required if using the play button on the top-right of my window. Who knows why they arcane things like this that are counter-intuitive, but it seems to be regular for python :) –
Cooney Configure the cwd
setting in launch.json
as follows:
{
"name": "Python",
"type": "python",
"pythonPath": "python",
...
"cwd": "<Path to the directory>"
...
}
"cwd": "${fileDirname}"
to run in current directory of open source file –
Forbiddance 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}"
}
}
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
}
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.
Locate the
settings.json
file.Windows
%APPDATA%\Code\User\settings.json
macOS
$HOME/Library/Application\ Support/Code/User/settings.json
Linux
$HOME/.config/Code/User/settings.json
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"]
}
]}
}
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
}
]
}
You can set up current working directory for debugged program using cwd
argument in launch.json
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
Setting "cwd"
to ${FileDirname}
in launch.json did not work for me; rather, I tried modifying settings.json, and actually got a solution.
In the settings.json file, add the field:
"python.terminal.executeInFileDir": true
After adding this field, my settings.json looks something like:
{
"python.terminal.executeInFileDir": true
}
This will definitely set the cwd to the directory that contains your file, as opposed to the root folder of the project.
It is important to set PYTHONPATH, you can set it on vscode:
{
"name": "Python debug",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"cwd": "${workspaceFolder}",
"env": {
"PYTHONPATH": "${cwd}"
}
}
Or just set it on terminal with:
$export PYTHONPATH=/home/user/myproject:$PYTHONPATH
Here /home/user/myproject
is your project path.
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.
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}" }
]
}
In my case, I kill debug terminal and re-run.
© 2022 - 2024 — McMap. All rights reserved.