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

时间:2012-11-30 23:03:27

标签: python

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

这部分代码是从程序的stdout中读取的。当我从它运行的线程中执行myfunc时!但是当我在线程中执行它时... 有什么建议吗?

7 个答案:

答案 0 :(得分:67)

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

如果你真的从运行Python中得到这个错误,这意味着Python解释器崩溃了。这种情况只有几个原因:

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

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

  3. 您的Python安装有问题。

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

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

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

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

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

答案 1 :(得分:51)

当我失败时,我才知道这种失败的另一个原因

  • 您可能正在使用大量数据并且RAM已满

这可能不适用于这种情况,但它也会引发相同的错误

答案 2 :(得分:2)

值得{@ 3}}和Karuhanga的评论中尝试使故障处理程序识别引起问题的行或库

faulthandler.enable()
// bad code goes here

$ python3 -q -X faulthandler
>>> /// bad cod goes here

答案 3 :(得分:0)

在我的情况下,在模块wich与db Mysql一起使用之前,我导入了pyxlsd模块。 在我将Mysql模块放在第一位(代码的上部)后,它变得像时钟一样工作。 认为存在命名空间问题。

答案 4 :(得分:0)

就我而言:我忘记了激活virtualenv

我在错误的virtualenv中安装了“ pip安装示例”

答案 5 :(得分:0)

与问题略微无关,但由于每当您搜索“(core dumped) python”时都会出现此页面,那么我可能会分享一个导致此错误的常见问题。

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

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

答案 6 :(得分:-12)

根据这篇文章中的一条评论:

https://bugs.launchpad.net/ubuntu/+source/python-librabbitmq/+bug/1353269

执行以下操作:

删除python-librabbitmq

 sudo apt-get remove python-librabbitmq

安装librabbitmq

sudo pip install librabbitmq