【问题标题】:Pycharm debugger works on Ubuntu but not on Windows for identical codePycharm 调试器可在 Ubuntu 上运行,但不能在 Windows 上运行相同的代码
【发布时间】:2016-07-24 15:24:45
【问题描述】:

更新:正在跟踪问题here

编辑:我可能不是唯一遇到此问题的人。我错过了今天也发布的这个,它看起来很相关:PyCharm debugger doesn't work

以下是使用 Pycharm Professional 时在 Windows 7 和 Ubuntu 14.04 上运行良好的最小示例

PyCharm 2016.1
Build #PY-145.260, built on March 22, 2016
JRE: 1.8.0_60-b27 x86
JVM: Java HotSpot(TM) Server VM by Oracle Corporation

现在是超级奇怪的部分:在 Ubuntu 的 Pycharm 调试器上,我没有遇到任何问题。但是,在 Window 的 Pycharm 调试器中,我得到了以下回溯(即使代码在不调试时运行良好!):

Traceback (most recent call last):
  File "D:\Program Files (x86)\JetBrains\PyCharm 2016.1\helpers\pydev\pydevd.py", line 1530, in <module>
    globals = debugger.run(setup['file'], None, None, is_module)
  File "D:\Program Files (x86)\JetBrains\PyCharm 2016.1\helpers\pydev\pydevd.py", line 937, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "C:/Users/Cornelis/PycharmProjects/SO-Help/test.py", line 11, in <module>
    class MainWindow(QtGui.QMainWindow):
  File "C:/Users/Cornelis/PycharmProjects/SO-Help/test.py", line 58, in MainWindow
    @QtCore.pyqtSlot(int, int)
AttributeError: 'module' object has no attribute 'pyqtSlot'
Backend TkAgg is interactive backend. Turning interactive mode on.

我什至不知道我应该如何开始调试,因为我以前从未见过这样的事情发生!如果您的程序在您运行它时工作但在您尝试调试它时却没有,而且它在另一个操作系统上调试得很好,这到底意味着什么?这只能是一个 Pycharm 错误吗?上面的回溯与我在主程序中得到的并不完全相同,但却是我能得到的最接近的。以下是我在完整程序中看到的回溯:

Backend TkAgg is interactive backend. Turning interactive mode on.
Traceback (most recent call last):
  File "D:\Program Files (x86)\JetBrains\PyCharm 2016.1\helpers\pydev\pydevd.py", line 1530, in <module>
    globals = debugger.run(setup['file'], None, None, is_module)
  File "D:\Program Files (x86)\JetBrains\PyCharm 2016.1\helpers\pydev\pydevd.py", line 937, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "D:/Home/Documents/PycharmProjects/BMDanalyse/BMDanalyse/SPCanalyse.py", line 22, in <module>
    from ViewBoxCustom import MultiRoiViewBox, ImageAnalysisViewBox
  File "D:/Home/Documents/PycharmProjects/BMDanalyse/BMDanalyse\ViewBoxCustom.py", line 68, in <module>
    class MultiRoiViewBox(pg.ViewBox):
  File "D:/Home/Documents/PycharmProjects/BMDanalyse/BMDanalyse\ViewBoxCustom.py", line 71, in MultiRoiViewBox
    clicked = QtCore.pyqtSignal(int, int)
AttributeError: 'module' object has no attribute 'pyqtSignal'

这是您的最小示例。只需复制并粘贴并单击 ViewBox。如果您运行它,应该会出现一个随机图像。但是如果你调试它,它就会爆炸。

import os, sys, matplotlib, matplotlib.pyplot
import numpy as np
from pyqtgraph.Qt import QtCore, QtGui
from pyqtgraph.widgets.GraphicsLayoutWidget import GraphicsLayoutWidget
import pyqtgraph as pg
import pyqtgraph.functions as fn

N = 256
ARR = np.random.random((N,N))*255

class MainWindow(QtGui.QMainWindow):

    def __init__(self, parent=None):

        QtGui.QMainWindow.__init__(self, parent)
        self.setupUserInterface()
        self.setupSignals()

    def setupUserInterface(self):
        """ Initialise the User Interface """
        # Left frame
        leftFrame = QtGui.QFrame()
        leftFrameLayout = QtGui.QHBoxLayout()
        leftFrame.setLayout(leftFrameLayout)
        leftFrame.setLineWidth(0)
        leftFrame.setFrameStyle(QtGui.QFrame.Panel)
        leftFrameLayout.setContentsMargins(0,0,5,0)

        # Left frame contents
        self.viewMain = GraphicsLayoutWidget()  # A GraphicsLayout within a GraphicsView
        leftFrameLayout.addWidget(self.viewMain)
        self.viewMain.setMinimumSize(200,200)
        self.vb = MultiRoiViewBox(lockAspect=True,enableMenu=True)
        self.viewMain.addItem(self.vb)
        self.vb.enableAutoRange()

        # Right frame
        self.sidePanel = SidePanel(self)

        # UI window (containing left and right frames)
        UIwindow         = QtGui.QWidget(self)
        UIwindowLayout   = QtGui.QHBoxLayout()
        UIwindowSplitter = QtGui.QSplitter(QtCore.Qt.Horizontal)
        UIwindowLayout.addWidget(UIwindowSplitter)
        UIwindow.setLayout(UIwindowLayout)
        self.setCentralWidget(UIwindow)
        UIwindowSplitter.addWidget(leftFrame)
        UIwindowSplitter.addWidget(self.sidePanel)

        self.setMinimumSize(600,500)
        self.resize(self.minimumSize())

    def setupSignals(self):
        """ Setup signals """
        # self.sidePanel.buttImageAdd.clicked.connect(self.showImage)
        self.vb.clicked.connect(self.on_vbc_clicked)

    @QtCore.pyqtSlot(int, int)
    def on_vbc_clicked(self, x, y):
        print(x)
        print(y)
        self.showImage()

    def showImage(self):
        """ Shows image in main view """
        self.vb.showImage(ARR)

class ViewMode():
    def __init__(self,id,cmap):
        self.id   = id
        self.cmap = cmap
        self.getLookupTable()
    def getLookupTable(self):
        lut = [ [ int(255*val) for val in self.cmap(i)[:3] ] for i in xrange(256) ]
        lut = np.array(lut,dtype=np.ubyte)
        self.lut = lut

class MultiRoiViewBox(pg.ViewBox):

    sigROIchanged = QtCore.Signal(object)
    clicked = QtCore.pyqtSignal(int, int)

    def __init__(self,parent=None,border=None,lockAspect=False,enableMouse=True,invertY=False,enableMenu=True,name=None):
        pg.ViewBox.__init__(self,parent,border,lockAspect,enableMouse,invertY,enableMenu,name)
        self.img      = None
        self.NORMAL   = ViewMode(0,matplotlib.cm.gray)
        self.DEXA     = ViewMode(1,matplotlib.cm.jet)
        self.viewMode = self.NORMAL

    def showImage(self,arr):
        if arr==None:
            self.img = None
            return
        if self.img==None:
            self.img = pg.ImageItem(arr,autoRange=False,autoLevels=False)
            self.addItem(self.img)
        self.img.setImage(arr,autoLevels=False)
        self.updateView()

    def updateView(self):
        self.background.setBrush(fn.mkBrush(self.viewMode.lut[0]))
        self.background.show()
        if    self.img==None: return
        else: self.img.setLookupTable(self.viewMode.lut)

    def mouseClickEvent(self, ev):
        if ev.button() == QtCore.Qt.RightButton and self.menuEnabled():
            ev.accept()
            self.raiseContextMenu(ev)
        elif ev.button() == QtCore.Qt.LeftButton:
            ev.accept()
            pos = self.mapToItem(self.img, ev.pos())
            self.clicked.emit(pos.x(), pos.y())

from pyqtgraph.Qt import QtCore,QtGui

class SidePanel(QtGui.QWidget):

    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self,parent)
        self.setMinimumWidth(250)
        self.buttMinimumSize = QtCore.QSize(36,36)
        self.setupImageToolbox()
        sidePanelLayout = QtGui.QVBoxLayout()
        sidePanelLayout.addWidget(self.imageToolbox)
        sidePanelLayout.setContentsMargins(0,0,0,0)
        self.setLayout(sidePanelLayout)

    def setupImageToolbox(self):
        # Image buttons
        self.buttImageAdd  = QtGui.QPushButton()
        imageButtons       = [self.buttImageAdd]
        for i in xrange(len(imageButtons)):
            image = imageButtons[i]
            image.setMinimumSize(self.buttMinimumSize)

        self.imageFileTools  = QtGui.QFrame()
        imageFileToolsLayout = QtGui.QHBoxLayout()
        self.imageFileTools.setLayout(imageFileToolsLayout)
        self.imageFileTools.setLineWidth(1)
        self.imageFileTools.setFrameStyle(QtGui.QFrame.StyledPanel)
        imageFileToolsLayout.addWidget(self.buttImageAdd)

        # Image Toolbox (containing imageFileList + imageFileList buttons)
        self.imageToolbox = QtGui.QFrame()
        self.imageToolbox.setLineWidth(2)
        self.imageToolbox.setFrameStyle(QtGui.QFrame.Panel | QtGui.QFrame.Raised)
        imageToolboxLayout = QtGui.QVBoxLayout()
        self.imageToolbox.setLayout(imageToolboxLayout)
        imageToolboxLayout.addWidget(self.imageFileTools)


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

【问题讨论】:

    标签: python debugging pyqt pycharm signals-slots


    【解决方案1】:

    我猜是因为你的.idea 文件夹/文件。

    点击pycharm菜单栏中的Run选项。

    点击Edit Configurations..

    验证您的解释器选项是否适合您的环境。每次切换操作系统时,您可能都必须切换此选项,因为 pycharm 会基于项目将您的配置保存在 .idea 文件夹/文件中。

    如果这不起作用,请备份您的 .idea 文件夹/文件,然后将其删除。然后在pycharm中打开项目,看看是否能解决问题。

    如果这些方法都不起作用,那么您正在处理 Jetbrains 端可能无法解决的问题。由于您使用的是 pyqt,我猜有些东西无法与调试器很好地配合。

    【讨论】:

    • 恐怕这两个选项都不起作用。看起来问题跟踪器也死了。对于我的 Pycharm 开发来说,这是悲伤的一天。出于显而易见的原因,我真的很想让我的应用在 Windows 上运行。
    【解决方案2】:

    在重新安装 Pycharm 并从头开始重新设置 python 包后,该问题已得到解决,但这次使用 python 64 位(之前使用 32 位)。此外,我使用的是 Continuum Analytics 的 python 包管理器。我不再使用它,所以这也可能是罪魁祸首。

    【讨论】:

      猜你喜欢
      • 2017-08-09
      • 2015-07-12
      • 1970-01-01
      • 1970-01-01
      • 2021-07-27
      • 2019-03-05
      • 1970-01-01
      • 2022-11-10
      • 2021-04-02
      相关资源
      最近更新 更多