Image.save производит 139?

Я пишу с дистрибутивом Anaconda Python 2.7.7 и использую редактор PyCharm.

Я пытаюсь написать довольно простую программу с графическим интерфейсом, которая отображает изображение, имеет редактируемую текстовую область и кнопки Enter и Cancel. (Конечно, он должен делать больше, но я не думаю, что это имеет отношение к этой проблеме.)

Я думал, что у меня это работает, но потом оно... перестало? Я отредактировал его до минимума, который, по крайней мере для меня, все еще вызывает ошибку (хорошо, также код для его центрирования).

Для меня происходит следующее: когда я запускаю его сейчас, он печатает «привет», а затем «Процесс завершен с кодом выхода 139». Но если я запускаю его в Debug, он работает нормально, печатает «hi», затем «hi2» и отображает изображение (которое находится в той же папке, что и файл кода).

Я попытался найти Image.save, но все, что я нашел, было "Если по какой-то причине не удалось сохранить , метод вызовет исключение (обычно исключение IOError).", чего, похоже, не происходит.

Я пытался найти код выхода 139, но, похоже, не так уж много можно найти, за исключением того, что, я думаю, он соответствует SIGSEGV? Но я не знаю, как использовать это, чтобы помочь здесь.

Вот код; любые предложения приветствуются!

import sys
from PyQt4.QtGui import *
import Image

class APP(QApplication):
    def __init__(self):
        QApplication.__init__(self, sys.argv)
        self.d = do_thing("image.jpg")
        self.d.show()

class do_thing(QWidget):
    def __init__(self, pm="image.jpg"):
        QWidget.__init__(self)
        self.layout = QVBoxLayout()
        self.lab = QLabel()
        im = Image.open(pm)
        print "hi"
        im.save("image.png")
        print "hi2"
        self.lab.setPixmap(QPixmap("image.png"))

        self.layout.addWidget(self.lab)
        self.setLayout(self.layout)
        fg = self.frameGeometry()
        center = QDesktopWidget().availableGeometry().center()
        fg.moveCenter(center)
        self.move(fg.topLeft())



if __name__ == "__main__":
    myapp = APP()
    sys.exit(myapp.exec_()

Обновление: я попытался распечатать текущий каталог; там нет ничего неожиданного. Там, где и должно быть, в той же папке, что и изображение. Я также пытался сохранить полный путь, но безрезультатно.

Я знаю, что IOError и segfault очень разные. Если бы это была IOError, у меня по крайней мере было бы что-то, с чем можно было бы работать, но я потерял 139. Странно то, что это работало какое-то время, и я не могу понять, почему оно остановилось или почему оно все еще работает в режиме отладки, а не в обычном режиме.

ОБНОВЛЕНИЕ: я попробовал исправление, предложенное здесь, но теперь, хотя он печатает оба оператора hi, окно исчезает, как только появляется, и я все еще получаю код выхода 139.


person xan    schedule 23.06.2015    source источник
comment
Это может быть проблема с другим текущим каталогом в режиме отладки/нормальном режиме. Попробуйте указать полный путь для сохранения/распечатки текущего каталога непосредственно перед сохранением.   -  person Eric Levieil    schedule 23.06.2015
comment
Обратите внимание, что генерация IOError и SIGSEGV (ошибка сегментации) — это два совершенно разных поведения. IOError вполне может быть ожидаемым результатом в некоторых сценариях (как, очевидно, здесь), а ошибка сегментации — это ошибка на уровне реализации C, которая должна быть исправлена ​​сопровождающими.   -  person Two-Bit Alchemist    schedule 23.06.2015
comment
Можете ли вы проверить, что изображение im в порядке, кроме выполнения save? Например, вы можете print im.format,im.size, im.mode. Кажется вполне возможным, что он уже в беспорядке после открытия, и сохранение вызывает segfault, но это не проблема. Также вы пробовали с некоторыми другими изображениями?   -  person strubbly    schedule 25.06.2015
comment
@strubbly print im.format, im.size, im.mode выдает ожидаемый результат JPEG (640, 480) RGB, который я пробовал с парой разных изображений.   -  person xan    schedule 25.06.2015
comment
Кажется, это указывает на ошибку в PIL, но ее трудно определить. Будет ли программа по-прежнему выдавать Segfault, если вы удалите PyQt и просто загрузите и сохраните изображение?   -  person strubbly    schedule 25.06.2015
comment
Нет, без всякого графического кода, даже импорта, это спасает. (Поэтому вынимаем даже from PyQt4.QtGui import *) Но... нужен графический интерфейс. Любые предложения по альтернативе? Я только что открыл для себя Qt, но он мне очень нравится.   -  person xan    schedule 25.06.2015
comment
Я думаю, вам нужно попробовать это с несколькими разными версиями программной среды - мне кажется, это ошибка.   -  person strubbly    schedule 04.07.2015