【问题标题】:Strange error while using Pycharm to debug PyQt gui使用 Pycharm 调试 PyQt gui 时出现奇怪的错误
【发布时间】:2017-07-31 00:35:31
【问题描述】:

我一直在使用 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


    【解决方案1】:

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

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

    【讨论】:

    • 你能想到这一点真是太棒了!我浏览了源代码,但无法弄清楚。谢谢!
    • 这行得通。在我的例子中,它是一个文件,code.py,可能是由 jupyter/ipython notebook 插件创建的
    • 很好的答案。
    • Brilliant .. 事实上我的文件名是 code 并且遇到了同样的问题。
    • 很好,很难找到修复,即使它很小。谢谢
    【解决方案2】:

    我最近遇到了这个问题(在处理 [SO]: zipfile.BadZipFile: Bad CRC-32 when extracting a password protected .zip & .zip goes corrupt on extract (@CristiFati's answer) 时)。作为说明,我将我的代码命名为 sn-ps code.py,除非另有限制。

    Python

    根据[Python 3.Docs]: Modules - The Module Search Path强调是我的):

    当一个名为 spam 的模块被导入时,解释器首先搜索具有该名称的内置模块。如果未找到,它将在变量sys.path 给出的目录列表中搜索名为spam.py 的文件。 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(也适用于包),则它已加载从那里。
    code 模块 (code.py) 不是随机选择的(阅读下一节)。查看[Python 3.Docs]: code - Interpreter base classes 了解有关标准Python 库的一部分的详细信息。

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

    结论

    • 在您的sys.path 中没有任何名为code 的模块/包(在Python 的标准路径之前)
    • 显然 pydevd.py 有其他参数,但快速检查并没有发现任何使用它们来解决此问题的可能性
    • 我能够成功调试我的 code.py 文件(来自 PyCharm),方法是从配置设置。但我认为这是一种(蹩脚的)解决方法(gainarie),对于复杂的设置,它甚至可能不起作用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-27
      • 2018-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 2013-05-05
      • 2020-12-27
      相关资源
      最近更新 更多