Python脚本在异常情况下挂起,直到按下ctrl-c

3
我在运行一个Python脚本时遇到了问题,这个脚本是在运行RH Linux并搭载Python 2.6.6的服务器上运行的。当我的脚本产生异常时,它会挂起,直到我按下CTRL-C才会打印traceback信息。如果我从命令行直接运行脚本而不直接调用python,则会出现这种情况,并在脚本第一行利用shebang进行调用。但如果我通过调用python执行该脚本,则不会出现这样的挂起问题。我已经搜索到类似的问题,但它们都与特定库有关,其中所有Python脚本都会出现此问题。我曾尝试在另一台服务器上使用相同的脚本,但没有遇到这个问题。我已包含了一个简单的测试脚本,它试图打开一个不存在的文件。
#!/usr/bin/env python
tempfile = open('noexists.txt','r')

当我在命令行上执行名为“test.py”的代码时,我会得到以下响应:
~/bin$> test.py
^CTraceback (most recent call last):
  File "/export/home/jwd3/bin/test.py", line 2, in <module>
    tempfile = open('noexists.txt','r')
IOError: [Errno 2] No such file or directory: 'noexists.txt'

如果我执行“python test.py”,则会得到以下响应:
~/bin$> python test.py
Traceback (most recent call last):
  File "test.py", line 2, in <module>
    tempfile = open('noexists.txt','r')
IOError: [Errno 2] No such file or directory: 'noexists.txt'

这里很难看出区别,但是执行时很明显。请注意第一个样本输出,在 Traceback 之前有 "^C"。直到我按下 CTRL-C,脚本才会一直挂起。第二个样本输出立即返回异常的 traceback,而不会挂起。
我尝试将脚本移动到新位置、将 shebang 从 #!/usr/bin/python 修改为 #!/usr/bin/env python 以及尝试不同的脚本。在所有情况下它们的行为都是相同的。非常感谢您的帮助。我不想使用 "python" 格式来调用所有的 python 脚本。

如果在命令行上运行“which python”,您会得到什么输出? - Rob Watts
如果你只是从命令行运行Python,然后插入命令“tempfile = open('noexists.txt','r')”,会得到什么结果?请问您的Python版本是多少?您能否使用ll命令列出当前目录(即运行脚本的目录)中的文件? - hzrari
@RobWatts /usr/bin/python - Perigoso90
@hzrari Python 2.6.6 (r266:84292, May 1 2012, 13:52:17) [GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] 在 Linux2 上运行。键入 "help"、"copyright"、 "credits" 或 "license" 了解更多信息。>>> tempfile = open('noexists.txt','r') 运行出错,错误信息如下:Traceback (most recent call last): File "<stdin>", line 1, in <module> IOError: [Errno 2] No such file or directory: 'noexists.txt' >>> - Perigoso90
你尝试过使用strace来查看哪个进程阻塞了吗? - loopbackbee
使用strace后,我发现它在socket调用上挂起了。在Google上快速搜索发现已经有类似的问题发布在stack overflow上。重新启动abrtd服务解决了这个问题。 - Perigoso90
1个回答

0
通过以上建议的帮助,我终于找到了解决问题的方法。在运行 strace 后,我发现代码在套接字连接上挂起。搜索相同的套接字连接信息后,我发现 Stack Overflow 上已经有一个类似的 issue 已经发布了。然后我又找到了第二个 issue,它也非常相似。这两个问题都提出了同样的建议。显然 Python 脚本与名为 abrtd 的服务发生冲突。建议重启此服务(abrtd)。重启后,Python 脚本挂起的问题得以解决。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接