scipy imshow конфликтует с El Capitan SIP и /var/folders/

Я столкнулся с некоторыми проблемами с разрешениями, и я уверен, что есть быстрое решение, но я не могу его найти.

Установка: Mac, OSX: El Capitan, Anaconda, Python3.5.1

Из bash (сделайте предварительный просмотр средством просмотра по умолчанию):

export SCIPY_PIL_IMAGE_VIEWER=/Applications/Preview.app/Contents/MacOS/Preview

От переводчика:

import scipy.misc as mi

im1 = mi.imread('local_filename.png')
mi.imshow(im1)

Выдает следующую ошибку из предварительного просмотра: файл «tmph_9q7lwu.png» не может быть открыт, потому что у вас нет разрешения на его просмотр.

Путь к этому файлу находится в: /var/folders/w4/wrnzszgd41d7064lx64nc10h0000gn/T/

Его разрешения: -rw------, UID приложения для предварительного просмотра: 501 (я)

Я чувствую, что это проблема El Capitan SIP (защита целостности системы), что приводит меня к моему вопросу:

  1. есть ли способ заставить scipy записывать временные файлы в папку, доступную для предварительного просмотра,
  2. или есть ли способ дать Preview разрешение на чтение из /var/folder/ без отключения SIP.

Спасибо!


person Darren McAffee    schedule 07.01.2016    source источник
comment
В чем причина попытки открыть файлы из /var/? Открываются ли файлы, когда они не в /var/?   -  person Maxwell Grady    schedule 07.01.2016
comment
Поэтому, когда вызывается imshow(), он преобразует объект im1 в изображение png, а затем сохраняет его во временном файле. Затем он передает этот временный файл предписанному «просмотрщику», в данном случае я сделал его предварительным просмотром. Но по какой-то причине Preview не может открыть его, выдавая ошибку, указанную выше. Файлы открываются нормально, когда я открываю их вручную из /var/folders/...   -  person Darren McAffee    schedule 07.01.2016
comment
Интересно - я не знал о временных файлах при использовании внешнего приложения для просмотра. Я подумаю еще о том, что может быть причиной ошибки разрешений.   -  person Maxwell Grady    schedule 07.01.2016
comment
@MaxwellGrady Да, это странно, если вы делаете /path/to/preview/executable /path/to/temp/file в bash, выдает ошибку прав доступа. Но если вы сделаете open /path/to/temp/file, это сработает.   -  person Darren McAffee    schedule 07.01.2016


Ответы (1)


Я нашел небольшой хак, который работает, есть два шага:

В pilutil.py отредактируйте строки 381+ (под def imshow),

import os
import time #Me: 1. needed later
os.close(fnum)

cmd = os.environ.get('SCIPY_PIL_IMAGE_VIEWER', 'see') 
cmd = 'open'  #Me: 2. User added line
print(fname)
status = os.system("%s %s" % (cmd, fname))

time.sleep(0.1) #Me: 1.    
os.unlink(fname)

Шаг 1. Для предварительного просмотра требуется временная задержка (0,05 — слишком быстро). В противном случае при отмене связи файл будет удален до того, как предварительный просмотр отобразит его правильно.

Шаг 2. Использование open вместо ссылки $SCIPY_PIL_IMAGE_VIEWER на приложение Preview работает. Последний метод имеет более общую ошибку.

Однако есть более серьезная проблема, которую я мог бы поднять в отдельном посте. Изнутри Баша:

/Applications/Preview.app/Contents/MacOS/Preview /path/to/file

Это должно привести к тому, что Preview откроет файл. Но вместо этого возникает ошибка прав доступа, по-видимому, независимо от того, где находится файл.

person Darren McAffee    schedule 07.01.2016