【问题标题】:python shell stuck on exitpython shell卡在退出
【发布时间】:2014-10-09 16:20:48
【问题描述】:

如果我按特定顺序导入了两个库,Python 不会退出。 我正在使用 Python 库 scitoolsfenicstools

在 python shell 中,以下将起作用:

import fenicstools
import scitools
exit()

这不会退出而是挂起(反转导入):

import scitools      # ok
import fenicstools   # ok
exit()               # gets me stuck, I can still exit with Ctrl+C

我可以在两台 Ubuntu 14.04 机器上重现这一点,但现在完全不知所措。我什至如何开始调试这样的问题?

背景:我正在使用sumatra 来跟踪我的数值模拟。它收集并记录我的项目依赖项的版本。因此,我无法控制它尝试这样做的顺序。结果:卡住了。

编辑: 按照@ErlVolton 的建议,我尝试了 pdb。将两个导入按有问题的顺序放入一个名为 test.py 的文件中。

$ pdb test.py
> /home/gallomania/test.py(1)<module>()
-> import scitools
(Pdb) n
> /home/gallomania/test.py(2)<module>()
-> import fenicstools
(Pdb) n
--Return--
> /home/gallomania/test.py(2)<module>()->None
-> import fenicstools
(Pdb) exit

...这使得 pdb 不会退出。

【问题讨论】:

  • 只使用第一个示例并继续吗?
  • @Takendarkk 想要了解为什么会发生某些事情并没有错。
  • 我正在使用sumatra 来跟踪我的数值模拟。它收集并记录我的项目依赖项的版本。因此,我无法控制它尝试这样做的顺序。结果:卡住了。
  • @gallomania 我认为您应该将其添加到您的问题中。
  • @Takendarkk 已经这样做了,谢谢你的建议。

标签: python scitools


【解决方案1】:

使用 pdb 单步执行每个操作,并查看 fenicstools 挂在其__init__.py 中的哪一行代码

https://docs.python.org/2/library/pdb.html

例子:

$ pdb test.py
> /home/cleekley/test/test.py(1)<module>()
-> import sys
(Pdb) s
> /home/cleekley/test/test.py(2)<module>()
-> import time
(Pdb) s
> /home/cleekley/test/test.py(4)<module>()
-> while True:
(Pdb) s
> /home/cleekley/test/test.py(5)<module>()
-> time.sleep(1)
(Pdb) s
> /home/cleekley/test/test.py(4)<module>()
-> while True:
(Pdb) quit

【讨论】:

  • 它可以很好地导入 fenicstools。这是它挂在上面的出口。
  • 你确定吗? pdb 说什么?在这些挂起的库之一中可能有一个 atexit 函数。我将在 virtualenv 中尝试,看看我能想出什么
  • 绝对确定,我正在交互式 shell 中对此进行测试。因此,按照您的建议,我已将两个导入文件放在一个名为 test.py 的文件中,并在其上运行 pdb。我会将结果附加到我的问题中。
  • @gallomania 请使用 pdb 命令 s 而不是 n 。此外,在 pdb 提示符下键入 exit 是告诉 pdb 退出,因为与调用 exit() 不同
  • 我非常感谢您为阐明这一点所做的努力。像你建议的那样逐步完成程序会让我陷入困境。我认为 scitools 太大而无法逐行遍历其导入。尽可能快地输入 's' ;)
猜你喜欢
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 2014-11-01
  • 2018-04-03
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多