52

我是 python 新手,遇到一个奇怪的错误:

Segmentation fault (core dumped)

当我执行以下代码时:

  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()

这部分代码是从程序的标准输出中读取的。当我 myfunc在线程外执行时,它可以工作!但是当我在线程fais中执行它时......有什么建议吗?

4

7 回答 7

98

"Segmentation fault (core dumped)"是当程序以SIGSEGV信号退出并且您启用了核心创建时 Linux 打印的字符串。这意味着某些程序已经崩溃。

如果您实际上是从运行 Python 中得到这个错误,这意味着 Python 解释器已经崩溃。发生这种情况的原因只有几个:

  1. 您正在使用用 C 编写的第三方扩展模块,并且该扩展模块已崩溃。

  2. 您正在(直接或间接)使用内置模块ctypes,并调用崩溃的外部代码。

  3. 您的 Python 安装有问题。

  4. 您在 Python 中发现了一个应该报告的错误。

第一个是迄今为止最常见的。如果您q是来自某个第三方扩展模块的某个对象的实例,您可能需要查看文档。

通常,当 C 模块崩溃时,这是因为您正在做一些无效的事情,或者至少是不常见且未经测试的事情。但是,从这个意义上说,这是否是你的“过错”——这并不重要。该模块应该引发一个可以调试的 Python 异常,而不是崩溃。因此,您可能应该向编写扩展程序的人报告错误。但与此同时,与其等待 6 个月来修复错误并发布新版本,不如弄清楚是什么导致了崩溃,以及是否有一些不同的方法来做你想做的事。或者切换到不同的库。

另一方面,由于您正在从其他地方读取和打印数据,因此您的 Python 解释器可能只是读取了该行"Segmentation fault (core dumped)"并忠实地打印了它读取的内容。在那种情况下,上游的其他一些程序可能崩溃了。(甚至有可能没有人崩溃——如果你从网上获取这个页面并打印出来,你会得到相同的行,对吗?)在你的情况下,根据你的评论,它可能是 Java 程序崩溃了。

如果您不确定是哪种情况(并且今天不想学习如何进行进程管理、核心文件检查或 C 级调试),有一个简单的测试方法:在print line添加一行print "And I'm OK". 如果您在该行之后看到Segmentation fault,那么 Python 并没有崩溃,而是其他人崩溃了。如果你没有看到它,那么很可能是 Python 崩溃了。

于 2012-11-30T23:06:51.460 回答
75

这种失败还有一个原因,当我失败时我才知道

  • 您可能正在处理大量数据并且您的 RAM 已满

这可能不适用于这种情况,但它也会引发相同的错误,并且由于这个问题出现在这个错误的最前面,我在这里添加了这个答案。

于 2015-06-25T10:56:37.310 回答
10

值得尝试 faulthandler 来识别导致问题的行或库,如此处所述https://stackoverflow.com/a/58825725/2160809和 Karuhanga 的评论

import faulthandler


faulthandler.enable()
// bad code goes here

或者

$ python3 -q -X faulthandler
>>> /// bad cod goes here
于 2020-02-26T12:59:30.803 回答
5

就我而言:我忘记激活 virtualenv

我在错误的 virtualenv 中安装了“pip install example”

于 2019-05-02T14:02:19.393 回答
1

与问题轻微无关,但由于每当您搜索“(核心转储)python”时都会出现此页面,因此我可能会分享一个导致此错误的常见问题。

OpenCV cv2.imshow() sometimes raises this error on servers without graphical interfaces.

希望我有所帮助。祝你有美好的一天!

于 2021-05-12T21:45:30.837 回答
1

就我而言,我在与 db Mysql 一起使用的模块之前导入了 pyxlsd 模块。在我确实将 Mysql 模块放在首位(代码中的上部)之后,它就变得像时钟一样工作了。认为存在一些命名空间问题。

于 2019-02-12T19:50:17.297 回答
1

就我而言,我在导入 mysql.connector 之前从 openpyxl 导入 load_workbook。我只是切换了顺序,它又开始工作了。

分段错误(核心转储)错误

from openpyxl import load_workbook
import mysql.connector

解决方案

import mysql.connector
from openpyxl import load_workbook
于 2021-10-14T19:42:38.150 回答