使用Pycharm调试PyQt gui时出现奇怪的错误

问题描述 投票:6回答:2

我一直在使用PyCharm在PyQt中调试我的gui。到目前为止,这已经非常成功,直到我在尝试调试我的gui时遇到了一个奇怪的错误。我已经在脚本的开头和各个点设置了断点,但程序没有机会达到这一点。我也尝试删除所有断点并运行调试但得到相同的结果。完整的追溯是:

C:\Users\pbreach\Continuum\Anaconda3\python.exe "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2016.3\helpers\pydev\pydevd.py" --multiproc --qt-support --client 127.0.0.1 --port 53720 --file C:/Users/pbreach/Dropbox/FIDS/cci/bluebook/code/input.py
Traceback (most recent call last):
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2016.3\helpers\pydev\_pydevd_bundle\pydevd_cython_wrapper.py", line 2, in <module>
    from _pydevd_bundle.pydevd_cython import trace_dispatch, PyDBAdditionalThreadInfo
ModuleNotFoundError: No module named '_pydevd_bundle.pydevd_cython'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2016.3\helpers\pydev\pydevconsole.py", line 8, in <module>
    from code import InteractiveConsole
ImportError: cannot import name 'InteractiveConsole'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2016.3\helpers\pydev\pydevd.py", line 26, in <module>
    from _pydevd_bundle.pydevd_additional_thread_info import PyDBAdditionalThreadInfo
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2016.3\helpers\pydev\_pydevd_bundle\pydevd_additional_thread_info.py", line 17, in <module>
    from _pydevd_bundle.pydevd_cython_wrapper import PyDBAdditionalThreadInfo
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2016.3\helpers\pydev\_pydevd_bundle\pydevd_cython_wrapper.py", line 26, in <module>
    mod = __import__(check_name)
  File "_pydevd_bundle\pydevd_cython_win32_36_64.pyx", line 9, in init _pydevd_bundle.pydevd_cython_win32_36_64 (_pydevd_bundle/pydevd_cython_win32_36_64.c:21388)
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2016.3\helpers\pydev\_pydevd_bundle\pydevd_frame.py", line 10, in <module>
    from _pydevd_bundle.pydevd_breakpoints import get_exception_breakpoint
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2016.3\helpers\pydev\_pydevd_bundle\pydevd_breakpoints.py", line 15, in <module>
    from _pydevd_bundle.pydevd_comm import get_global_debugger
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2016.3\helpers\pydev\_pydevd_bundle\pydevd_comm.py", line 75, in <module>
    import pydevconsole
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2016.3\helpers\pydev\pydevconsole.py", line 10, in <module>
    from _pydevd_bundle.pydevconsole_code_for_ironpython import InteractiveConsole
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2016.3\helpers\pydev\_pydevd_bundle\pydevconsole_code_for_ironpython.py", line 105
    except SyntaxError, err:
                      ^
SyntaxError: invalid syntax

Process finished with exit code 1

有谁知道导致此错误的原因以及如何解决?当我正常运行代码(没有调试)时,我不会遇到任何这些错误。

python debugging pyqt pycharm pydev
2个回答
19
投票

我遇到了同样的问题,我花了一段时间,但我发现了一个适合我的解决方案。我相信会发生什么,是调试器在目录_pydevd_bundle.pydevd_cython中寻找模块code。但是,因为您从自己的code目录运行脚本,调试器会检查您的文件夹,看到它们不是模块,并抛出错误。这可以解释为什么删除__init__.py有效,因为调试器不再混淆这两个目录。

因此,将代码目录重命名为其他内容,应解决问题,并让您保留init文件。


1
投票

我最近遇到了这个问题(在[SO]: zipfile.BadZipFile: Bad CRC-32 when extracting a password protected .zip & .zip goes corrupt on extract (@CristiFati's answer)工作时)。作为一个注释,我将我的代码片段命名为code.py,除非另有约束。

蟒蛇

根据[Python 3.Docs]: Modules - The Module Search Path(重点是我的):

导入名为spam的模块时,解释器首先搜索具有该名称的内置模块。如果没有找到,它会在变量spam.py给出的目录列表中搜索名为sys.path的文件。 sys.path从这些位置初始化:

  • 包含输入脚本的目录(或未指定文件时的当前目录)。
  • PYTHONPATH(目录名列表,语法与shell变量PATH相同)。
  • 依赖于安装的默认值。

小演示:

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q042705279]> set py
PYTHONPATH=E:\Work\Dev\Utils

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q042705279]> dir /b

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q042705279]> "e:\Work\Dev\VEnvs\py_064_03.06.08_test0\Scripts\python.exe"  -c "import code;print(code)"
<module 'code' from 'c:\\Install\\x64\\Python\\Python\\03.06.08\\Lib\\code.py'>

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q042705279]> echo. 2>code.py


[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q042705279]> dir /b
code.py

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q042705279]> "e:\Work\Dev\VEnvs\py_064_03.06.08_test0\Scripts\python.exe"  -c "import code;print(code)"
<module 'code' from 'e:\\Work\\Dev\\StackOverflow\\q042705279\\code.py'>

正如所见(在正常情况下),如果在cwd中找到模块代码(也适用于包),则从那里加载它。 代码模块(code.py)不是随机选择的(请阅读下一节)。有关标准Python库的一部分的详细信息,请查看[Python 3.Docs]: code - Interpreter base classes

PyCharm

运行PyCharm配置时,PyCharm(简化)在配置的脚本上启动项目解释器。这有效。在我的情况下它是:

"E:\Work\Dev\VEnvs\py_064_03.06.08_test0\Scripts\python.exe" "E:/Work/Dev/StackOverflow/q042705279/code.py"

但是,在调试相同的配置时,事情会复杂一些。简化版:

  • 创建一个服务器(由pydevd)执行目标脚本
  • PyCharm IDE连接到该服务器以获得输出

再次,就我而言,它是:

"E:\Work\Dev\VEnvs\py_064_03.06.08_test0\Scripts\python.exe" "C:\Install\x64\JetBrains\PyCharm Community Edition\AllVers\helpers\pydev\pydevd.py" --multiproc --qt-support=auto --client 127.0.0.1 --port 45931 --file "E:/Work/Dev/StackOverflow/q042705279/code.py"

关键点是pydevconsole.py开头的某个地方(在异常追踪中提到):

try:
    from code import InteractiveConsole
except ImportError:
    from _pydevd_bundle.pydevconsole_code_for_ironpython import InteractiveConsole

因此,它尝试加载InteractiveConsole,它显然会失败。 显然,代码模块特定于CPython。它的缺席意味着它的另一个分布(检查[Python]: Alternative Python Implementations)。 IPython替代方案(默认选择)包含不符合Python 3(语法)的脚本(在当前点IronPython位于v2.7.9)。请注意,这甚至在达到用户代码之前就会发生 将解释器切换到Python 2也无济于事,它将通过这一点,但稍后它还将尝试设置交互式控制台,这将失败。

结论

  • sys.path中没有任何模块/包命名代码(在Python的标准路径之前)
  • 显然pydevd.py还有其他参数,但快速检查并未发现使用它们解决此问题的任何可能性
  • 通过从配置设置更改工作目录,我能够成功调试我的code.py文件(来自PyCharm)。但我认为这是一种(跛脚)解决方法(获得者),对于复杂的设置,它甚至可能都不起作用
© www.soinside.com 2019 - 2024. All rights reserved.