spyder-ide / spyder

Official repository for Spyder - The Scientific Python Development Environment
https://www.spyder-ide.org
MIT License
8.36k stars 1.62k forks source link

Debug File (Ctrl+F5) does not respect working directory in Run configuration #22496

Open roteiro opened 2 months ago

roteiro commented 2 months ago

Issue Report Checklist

Problem Description

Consider the following project structure of the folder testproject

.
├── .python-version
├── .spyproject
│   └── config
├── .venv
│   ├── .gitignore
│   ├── CACHEDIR.TAG
│   ├── Lib
│   ├── pyvenv.cfg
│   ├── Scripts
│   └── share
├── pyproject.toml
├── README.md
├── scripts
│   └── foo.py
└── uv.lock

The python interpreter is set to path/to/testproject/.venv/Scripts/python.exe. I want to run foo.py from the dir testproject , therefore, i set the following run configuration under Run->Configuration per File image

Content of foo.py

if __name__ == "__main__":
    print("test")
    raise ValueError

What steps reproduce the problem?

I tried two different ways of running the file: a) Run foo.py with F5 b) Debug foo.py with Ctrl+F5

What is the expected output? What do you see instead?

a) I expect to to automatically enter the debugger due to the run configuration and the deliberate ValueError. This basically happens, except for the unexpected *** NameError: name '_pdbcmd_print_frame_status' is not defined

Full output of a)

In [1]: %runfile C:/Users/path/to/testproject/scripts/foo.py --wdir C:/Users/path/to/testproject/testproject --post-mortem
test
Traceback (most recent call last):

  File ~\path\to\testproject\.venv\Lib\site-packages\spyder_kernels\customize\utils.py:209 in exec_encapsulate_locals
    exec_fun(compile(code_ast, filename, "exec"), globals)

  File c:\users\path\to\testproject\testproject\scripts\foo.py:3
    raise ValueError

ValueError

****************************************
Entering post mortem debugging...
****************************************
*** NameError: name '_pdbcmd_print_frame_status' is not defined

IPdb [1]:

b) I expect the execution with the wdir set to the project root and the lauch of the debugger. However, the Working directory settings seem to be ignored for Ctrl+F5, since the working directory is changed to the folder scripts Full output of b)

In [3]: %debugfile C:/Users/path/to/testprojct/testproject/scripts/foo.py --wdir
*** NameError: name '_pdbcmd_print_frame_status' is not defined

IPdb [1]: 

Bonus Question

Is it correct that at the moment, there is no possibility to set the global run configuration such that the wdir is relative to the currently opened Spyder project?

Versions

Dependencies

# Mandatory:
aiohttp >=3.9.3                  :  3.10.5 (OK)
asyncssh >=2.14.0,<3.0.0         :  2.17.0 (OK)
atomicwrites >=1.2.0             :  1.4.1 (OK)
chardet >=2.0.0                  :  5.2.0 (OK)
cloudpickle >=0.5.0              :  3.0.0 (OK)
cookiecutter >=1.6.0             :  2.6.0 (OK)
diff_match_patch >=20181111      :  20230430 (OK)
github >=2.3.0                   :  2.4.0 (OK)
importlib_metadata >=4.6.0       :  8.4.0 (OK)
intervaltree >=3.0.2             :  3.1.0 (OK)
IPython >=8.13.0,<9.0.0,!=8.17.1 :  8.27.0 (OK)
jedi >=0.17.2,<0.20.0            :  0.19.1 (OK)
jellyfish >=0.7                  :  1.1.0 (OK)
jsonschema >=3.2.0               :  4.23.0 (OK)
keyring >=17.0.0                 :  25.3.0 (OK)
nbconvert >=4.0                  :  7.16.4 (OK)
numpydoc >=0.6.0                 :  1.8.0 (OK)
parso >=0.7.0,<0.9.0             :  0.8.4 (OK)
pexpect >=4.4.0                  :  4.9.0 (OK)
pickleshare >=0.4                :  0.7.5 (OK)
psutil >=5.3                     :  6.0.0 (OK)
pygments >=2.0                   :  2.18.0 (OK)
pylint >=3.1,<4                  :  3.2.7 (OK)
pylint_venv >=3.0.2              :  3.0.3 (OK)
pyls_spyder >=0.4.0              :  0.4.0 (OK)
pylsp >=1.12.0,<1.13.0           :  1.12.0 (OK)
pylsp_black >=2.0.0,<3.0.0       :  2.0.0 (OK)
pyuca >=1.2                      :  1.2 (OK)
qdarkstyle >=3.2.0,<3.3.0        :  3.2.3 (OK)
qstylizer >=0.2.2                :  0.2.3 (OK)
qtawesome >=1.3.1,<1.4.0         :  1.3.1 (OK)
qtconsole >=5.6.0,<5.7.0         :  5.6.0 (OK)
qtpy >=2.4.0                     :  2.4.1 (OK)
rtree >=0.9.7                    :  1.3.0 (OK)
setuptools >=49.6.0              :  73.0.1 (OK)
sphinx >=0.6.6                   :  8.0.2 (OK)
spyder_kernels >=3.0.0,<3.1.0    :  3.0.0 (OK)
superqt >=0.6.2,<1.0.0           :  0.6.7 (OK)
textdistance >=4.2.0             :  4.6.2 (OK)
three_merge >=0.1.1              :  0.1.1 (OK)
watchdog >=0.10.3                :  5.0.1 (OK)
yarl >=1.9.4                     :  1.9.7 (OK)
zmq >=24.0.0                     :  26.2.0 (OK)

# Optional:
cython >=0.21                    :  3.0.11 (OK)
matplotlib >=3.0.0               :  3.9.2 (OK)
numpy >=1.7                      :  2.1.0 (OK)
pandas >=1.1.1                   :  2.2.2 (OK)
scipy >=0.17.0                   :  1.14.1 (OK)
sympy >=0.7.3                    :  1.13.2 (OK)
glindstr commented 1 month ago

I'm experiencing the same issue. "Debug File (Ctrl+F5)" ignores all working directory settings. I have a local module and when I try to debug the module the working directory immediately changes to that of the module where I want it to stay at the currently working directory. "Run (F5)" works as intended as set in the configuration. I'm unable to debug local modules in Spyder 6. This is an issue in 6.0.0 and 6.0.1.

mvillion commented 1 month ago

Same issue, "command line options" are ignored when using the Debugger. If I use Run file (F5) with "run this file in:" Debugger, debugger starts with command line options but the breakpoints are ignored. If I use Debug file (Ctrl-F5), debugger starts, breakpoints work but command line options are ignored.

I cannot debug with command line options.

dalthviz commented 1 month ago

Hi @roteiro thank you for the report! Checking seems like the *** NameError: name '_pdbcmd_print_frame_status' is not defined is related with #22500 . Related with the working directory config/settings what do you think @ccordoba12 @impact27 ? I think for the moment, as a workaround, you should be able to run manually the debugfile magic and provide the appropiate working dir running something like %debugfile <file path> --wdir <working dir path> (maybe that could help you too @mvillion and @glindstr)

Is it correct that at the moment, there is no possibility to set the global run configuration such that the wdir is relative to the currently opened Spyder project?

I would say no, sorry :/ the closes thing you could do currently is to set the global config to use the Working directory settings > The current working directory. Then when you have a project loaded the project path will be used as the current working directory and, if you want to use a specific path inside the project, manually change the working dir using the working directory toolbar. However, is there something else that could be done currently for something like that @ccordoba12 ?

ccordoba12 commented 1 month ago

However, is there something else that could be done currently for something like that?

I think we should pass the working directory to the %debugfile magic, as you pointed out above. It shouldn't be that hard to do.

mvillion commented 1 month ago

[ These commands were working in Spyder 5: In [5]: runfile("/home/user/test.py", args="--feat=027b") --> ok In [6]: debugfile("/home/user/test.py", args="--feat=027b") UsageError: unrecognized arguments: args=--feat=027b) ]

The suggested workaround is working: %debugfile /home/user/test.py --args="--feat=027b" 👍