【问题标题】:ProtocolConnectionException in the context of Python versionsPython 版本上下文中的 ProtocolConnectionException
【发布时间】:2012-12-15 17:19:32
【问题描述】:

我对 Python 完全不熟悉,但我有一段代码需要修复。它来自 Sublime Text 2 的 SublimeXdebug 插件,这是唯一一个使用 Sublime Text 进行 PHP 调试的插件。该插件是用 Python 编写的,更具体地说,是用 Python 2.6 或更早版本编写的,而运行该插件的系统 (Ubuntu 12.04) 仅支持 Python >= 2.7。但是,插件/Sublime Text 开发人员似乎设法“模拟”了 Python 2.6,因为当我在插件代码中插入 print sys.version 时,它会报告 Python 2.6.6。它本可以帮助其他一些插件,但对 SublimeXdebug 没有帮助:

Traceback (most recent call last):
  File ".\threading.py", line 532, in __bootstrap_inner
  File ".\threading.py", line 484, in run
  File "./Xdebug.py", line 321, in thread_callback
    protocol.accept()
  File "./Xdebug.py", line 137, in accept
    raise(ProtocolConnectionException, x)
ProtocolConnectionException

有问题的一段代码(可能不是唯一的)是这样的:

def accept(self):
    serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    if serv:
        try:
            serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            serv.settimeout(1)
            serv.bind(('', self.port))
            serv.listen(1)
            self.listening = True
            self.sock = None
        except Exception, x:
            raise(ProtocolConnectionException, x) # line 137 <------------

        while self.listening:
            try:
                self.sock, address = serv.accept()
                self.listening = False
            except socket.timeout:
                pass

        if self.sock:
            self.connected = True
            self.sock.settimeout(None)
        else:
            self.connected = False
            self.listening = False

        try:
            serv.close()
            serv = None
        except:
            pass
        return self.sock
    else:
        raise ProtocolConnectionException('Could not create socket')

(对于那些建议在 .deb 中下载 2.6 版本的 Python,解压缩,然后将 usr/lib/python2.6 移动到 {sublime text folder}/lib 的人,我已经尝试过了,但没有帮助。)

那么问题的根源可能在于 Python 版本不匹配或其他原因吗?

编辑:

如果我将第 137 行更改为 raise,它会说:

Traceback (most recent call last):
  File ".\threading.py", line 532, in __bootstrap_inner
  File ".\threading.py", line 484, in run
  File "./Xdebug.py", line 321, in thread_callback
  File "./Xdebug.py", line 132, in accept
  File "<string>", line 1, in bind
error: [Errno 98] Address already in use

第 132 行是serv.bind(('', self.port))

【问题讨论】:

  • 他们不需要“模仿”Python 2.6。 Sublime Text 可能只是捆绑了它自己的“干净”的 Python 私有安装,而不是依赖于系统提供的安装。因此,您看到的错误可能不是由 Python 版本不匹配引起的。
  • 你确定有什么东西在“模拟”Python 2.6,而不是真正使用 2.6 吗? sys.executable 是什么?另外,如果将第 137 行的 raise(Protocol....) 更改为 raise,会发生什么情况?这将引发最初的异常(好像根本没有 try: except: block),我们将能够看到问题到底是什么。
  • @PhilFrost 是的,我检查了,安装的版本是 2.7,/usr/lib/python2.6 文件夹几乎是空的,不像 /usr/lib/python2.7,它看起来像一个成熟的 Python 文件和文件夹家族。而sys.executable 在此 Stack Overflow 页面上仅出现一次,在您的评论中:)
  • @PhilFrost 更新了问题以引用它产生的输出,如果该行是raise

标签: php python sockets networking sublimetext2


【解决方案1】:

我怀疑这个 Python 版本的东西是红鲱鱼。发生的事情是这段代码正在尝试侦听 TCP 端口(无论 self.port 是什么),但其他东西已经在那里侦听。在 Linux 上,您可以运行 sudo netstat -anp | grep LISTEN 来确定它是什么进程。

【讨论】:

    猜你喜欢
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多