У меня есть файл, который содержит единственное изображение определенного формата при определенном смещении. Я могу уже получить подобное файлу для встроенного изображения, которое поддерживает read()
, seek()
, и tell()
. Я хочу использовать в своих интересах существующий декодер PIL, чтобы обработать встроенное изображение, но смочь рассматривать весь файл как "файл изображения" самостоятельно.
Я не смог выяснить, как сделать это, учитывая доступную документацию и задавался вопросом, было ли у кого-либо какое-либо понимание относительно того, как я мог сделать это.
В Unix sys.stdin.isatty ()
достоверно сообщает, поступает ли стандартный ввод с терминального устройства (или перенаправляется иным образом), и аналогичным образом для того же метода на sys.stdout
и sys.stderr
, чтобы можно было использовать эти вызовы для определения того, выполняется ли приложение в интерактивном режиме или Как именно вы хотите их использовать, зависит от того, что вы хотите сделать, если (например) как стандартные входные, так и выходные данные перенаправляются на нетерминал, но стандартная ошибка идет на терминал - рассмотрим каждую из 8 возможностей, от всех из них перенаправляется на нетерминалы ни к одному из них, и решите, что вы хотите сделать в каждом случае.
В Windows ситуация отличается, поскольку выполнение файла .py
(в отличие от файла .pyw
) создаст новую временную консоль (в Unix нет абсолютно эквивалентной ситуации); Полагаю, это дело, с которым вы хотите разобраться? (Или речь идет только о перенаправлении стандартных потоков ввода-вывода в файлы, что возможно в Windows примерно так же, как в Unix?). Я думаю, что лучшим подходом в Windows может быть использование win32api.SetConsoleCtrlHandler для установки обработчика для таких событий, как CTRL _ CLOSE _ EVENT
- это путь, что обработчик должен быть вызван (в данном случае, когда консоль закрывается), если является консолью для процесса, но не иначе. Или, если вы заботитесь только о том, есть ли консоль вообще или нет (и предпочитайте обращаться с вещами другим способом), попробуйте вызвать win32api.GetConsureTitle в try
ветви try
/, за исключением
- это создаст исключение (на которые вы ловите и отвечаете, устанавливая для вашей логической переменной значение False
) если нет консоли, и просто работать (в этом случае для этой логической переменной устанавливается значение True
), если является консолью.
В этом случае лучше искать недопустимые символы, чем пытаться сопоставить все символы. После появления одного недопустимого символа поиск может завершиться и вернуть ошибку. Это более эффективно, чем всегда сканирование всей последовательности.
if (preg_match("/[^A-Za-z'-]/", $First)) { die ("invalid first name"); }
^ внутри набора [] делает его соответствующим всем, не входящим в набор. и поскольку последовательность является недопустимой, если у нас есть даже один недопустимый символ, нет необходимости в том, чтобы набор имел оператор повторения.
Еще лучше было бы получить более полезное сообщение об ошибке
if (preg_match("/[^A-Za-z'-]/", $First, $Inv)) { die ("{$Inv[0]} not allowed in first name"); }
-121--2910285- То, что я сделал для решения этой проблемы, было получено из нижестоящего элемента ImageFile.ImageFile
, принадлежащего встроенному формату, вместо ImageFile.ImageFile
непосредственно. Затем в _ open ()
я заменил selfp
на файл, похожий на внедренное изображение, и вызвал родительский _ open ()
.Я не могу сказать, что я особенно рад делать это таким образом, но, кажется, это сработало.
Соответствующая глава документации эта , и я думаю, что это довольно ясно: если, например, вы хотите декодировать файлы изображений в новом .zap
-format, вы пишете модуль ZapImagePlugin.py
, который должен выполнять пару вещей:
класс ZapImageFile (ImageFile.ImageFile):
со строковыми атрибутами формат
и format_description
, а также метод-перехватчик def _open (self)
(из которых будет подробнее позже); Изображение .register_open ('zap', ZapImageFile)
и Image.register_extension ('ZAP', '.zap')
Спецификации для метода _open
очень четко изложены в главу - он должен прочитать данные изображения и метаданные из открытого двоичного файла, подобного объекту self.fp
, поднять SyntaxError
(или другое исключение) как можно скорее, если он обнаружит, что файл на самом деле не в правильном формате, установите не менее self.size
и self.mode
атрибуты, и чтобы разрешить чтение изображения, также self.tile
, список дескрипторов плитки снова в формате, указанном в этой главе (включая смещение файла, о котором вы говорите, что знаете, и декодер - если необработанные или битовые декодеры, описанные в этой главе, не соответствуют вашим потребностям, в главе рекомендуется изучение источников некоторых из множества поставляемых декодеров, таких как JPEG, PNG и т. д.).