我是python的新手,我得到一个奇怪的错误:
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)
当我执行以下代码时:
class Workspace(QMainWindow, Ui_MainWindow):
""" This class is for managing the whole GUI `Workspace'.
Currently a Workspace is similar to a MainWindow
"""
def __init__(self):
#p= subprocess.Popen(["java -Xmx256m -jar bin/HelloWorld.jar"],cwd=r'/home/karen/sphinx4-1.0beta5-src/sphinx4-1.0beta5/', shell=True, stdout=subprocess.PIPE, bufsize= 4024)
try:
from Queue import Queue, Empty
except ImportError:
while True:
#from queue import Queue, Empty # python 3.x
print "error"
ON_POSIX = 'posix' in sys.builtin_module_names
def enqueue_output(out, queue):
for line in iter(out.readline, b''):
queue.put(line)
out.close()
p= Popen(["java -Xmx256m -jar bin/HelloWorld.jar"],cwd=r'/home/karen/sphinx4-1.0beta5-src/sphinx4-1.0beta5/',stdout=PIPE, shell=True, bufsize= 4024)
q = Queue()
t = threading.Thread(target=enqueue_output, args=(p.stdout, q))
#t = Thread(target=enqueue_output, args=(p.stdout, q))
t.daemon = True # thread dies with the program
t.start()
# ... do other things here
def myfunc(q):
while True:
try: line = q.get_nowait()
# or q.get(timeout=.1)
except Empty:
print('Vacio')
else: # got line
# ... do something with line
print line
thread = threading.Thread(target=myfunc, args=(q,))
thread.start()
Run Code Online (Sandbox Code Playgroud)
这部分代码是从程序的stdout中读取的.当我执行 myfunc该线程时,它的工作原理!但是当我在线程中执行它时...任何建议?
aba*_*ert 75
"Segmentation fault (core dumped)"是当程序存在SIGSEGV信号并且启用了核心创建时,linux打印的字符串.这意味着某些程序崩溃了.
如果你真的从运行Python中得到这个错误,这意味着Python解释器崩溃了.这种情况只有几个原因:
您正在使用用C编写的第三方扩展模块,该扩展模块已崩溃.
您(直接或间接)使用内置模块ctypes,并调用崩溃的外部代码.
你的Python安装有问题.
您发现了Python中应该报告的错误.
第一种是迄今为止最常见的.如果您q是来自某个第三方扩展模块的某个对象的实例,您可能需要查看文档.
通常,当C模块崩溃时,这是因为你正在做一些无效的事情,或者至少是不常见和未经测试的事情.但在这个意义上它是否是你的"错误"并不重要.该模块应该引发一个可以调试的Python异常,而不是崩溃.所以,您应该向编写扩展程序的人报告错误.但与此同时,你需要弄清楚你做了什么才能引发崩溃,而不是等待6个月才能修复bug并推出新版本,以及是否有不同的方式来做你想做的事情.或者切换到其他库.
另一方面,由于您正在从其他地方读取和打印数据,因此您的Python解释器可能只读取该行"Segmentation fault (core dumped)"并忠实地打印它所读取的内容.在那种情况下,上游的其他一些程序可能会崩溃.(甚至有可能没有人崩溃 - 如果你从网上抓取这个页面并将其打印出来,你会得到同样的一行,对吗?)在你的情况下,根据你的评论,它可能是崩溃的Java程序.
如果您不确定它是哪种情况(并且不想学习如何进行流程管理,核心文件检查或今天的C级调试),那么可以通过一种简单的方法进行测试:print line添加一行后说print "And I'm OK".如果你看到Segmentation fault线后,那么Python没有崩溃,其他人也没有.如果你没有看到它,那么可能是Python崩溃了.
Cyb*_*ova 53
当我失败时,我才知道这种失败的另一个原因
这可能不适用于这种情况,但它也会引发相同的错误
值得尝试faulthandler来识别导致问题的行或库,如此处/sf/answers/4117800781/和Karuhanga的评论中所述
faulthandler.enable()
// bad code goes here
Run Code Online (Sandbox Code Playgroud)
或者
$ python3 -q -X faulthandler
>>> /// bad cod goes here
Run Code Online (Sandbox Code Playgroud)