В разделе представлены исключения, которые возникают в результате ошибок, возникающих в ходе взаимодействия приложения Python и операционной системы и являются подклассами OSError
.
Содержание:
- Базовый класс исключений OSError
- Исключение OS BlockingIOError,
- Исключение OS ChildProcessError,
- Исключение OS ConnectionError,
- Исключение OS BrokenPipeError,
- Исключение OS ConnectionAbortedError,
- Исключение OS ConnectionRefusedError,
- Исключение OS ConnectionResetError,
- Исключение OS FileExistsError,
- Исключение OS FileNotFoundError,
- Исключение OS InterruptedError,
- Исключение OS IsADirectoryError,
- Исключение OS NotADirectoryError,
- Исключение OS PermissionError,
- Исключение OS ProcessLookupError,
- Исключение OS TimeoutError.
OSError([arg])
:
OSError(errno, strerror[, filename[, winerror[, filename2]]])
:
Исключение OSError()
возникает, когда системная функция возвращает системную ошибку, включая сбои ввода-вывода, типа таких, как «файл не найден» или «диск заполнен». Не срабатывает для недопустимых типов аргументов или других случайных ошибок.
Вторая форма конструктора устанавливает соответствующие атрибуты. У всех атрибутов по умолчанию None
если атрибут не указан. Для обратной совместимости, если переданы три аргумента, атрибут args
содержит только 2 кортежа из первых двух аргументов конструктора.
Конструктор часто фактически возвращает подкласс OSError
, как описано в исключениях ОС ниже. Конкретный подкласс зависит от конечного значения errno
. Это поведение имеет место только при построении OSError
напрямую или через псевдоним и не наследуется при создании подклассов.
OSError()
:
-
errno
— Числовой код ошибки из переменнойC
errno
-
winerror
— В Windows это дает вам собственный код ошибки Windows. Атрибутerrno
тогда является приблизительным переводом, в терминахPOSIX
, это нативный код ошибки.В Windows, если аргумент конструктора
winerror
является целым числом, атрибутerrno
определяется из кода ошибки Windows, а аргументerrno
игнорируется. На других платформах аргументwinerror
игнорируется, а атрибутwinerror
не существует. -
strerror
— Соответствующее сообщение об ошибке, предоставленное операционной системой. Он отформатирован функциями языкаC
perror()
подPOSIX
иFormatMessage()
под Windows. -
filename
иfilename2
— Для исключений, которые включают путь к файловой системе, напримерopen()
илиos.unlink()
.filename
— это имя файла, передаваемое функции. Для функций, которые включают два пути файловой системы, например,os.rename()
,filename2
— соответствует второе имя файла, переданное функции.
Исключения подкласса OSError.
Ниже перечисленные исключения, являются подклассом OSError()
и возникают в зависимости от системного кода ошибки.
BlockingIOError
:
Исключение BlockingIOError
поднимается, когда операция блокирует объект (например, сокет), установленный для неблокирующей операции. Соответствует errno EAGAIN
, EALREADY
, EWOULDBLOCK
и EINPROGRESS
.
В дополнение к таковым OSError
, BlockingIOError
может иметь еще один атрибут:
characters_written
— целое число, содержащее количество символов, записанных в поток до его блокировки. Этот атрибут доступен при использовании буферизованных классов ввода/вывода изio
модуля.
ChildProcessError
:
Исключение ChildProcessError
поднимается при сбое операции с дочерним процессом. Соответствует errno ECHILD
.
ConnectionError
:
Исключение ConnectionError
это базовый класс для вопросов, связанных с подключением.
Подклассы ConnectionError
:
-
BrokenPipeError
:Исключения
BrokenPipeError
это подклассConnectionError
, возникающий при попытке записи в канал, когда другой конец был закрыт, или при попытке записи в сокет, который был отключен для записи. Соответствуетerrno EPIPE
иESHUTDOWN
. -
ConnectionAbortedError
:Исключения
ConnectionAbortedError
это подклассConnectionError
, возникает, когда попытка соединения прерывается партнером. Соответствуетerrno ECONNABORTED
. -
ConnectionRefusedError
:Исключения
ConnectionRefusedError
это подклассConnectionError
, возникающий, когда одноранговый узел отклоняет попытку подключения. Соответствуетerrno ECONNREFUSED
. -
ConnectionResetError
:Исключения
ConnectionResetError
это подклассConnectionError
, возникающий при сбросе соединения узлом. Соответствуетerrno ECONNRESET
.
FileExistsError
:
Исключение FileExistsError
поднимается при попытке создать файл или каталог, который уже существует. Соответствует errno EEXIST
.
FileNotFoundError
:
Исключение FileNotFoundError
поднимается, когда файл или каталог не существует. Соответствует errno ENOENT
.
InterruptedError
:
Исключение InterruptedError
поднимается, когда системный вызов прерывается входящим сигналом. Соответствует errno EINTR
.
Python-3.5: Python теперь повторяет системные вызовы, когда системный вызов прерывается сигналом, кроме случаев, когда обработчик сигнала вызывает исключение вместо возбуждения InterruptedError
.
IsADirectoryError
:
Исключение IsADirectoryError
поднимается, когда к каталогу применяется файловая операция, например os.remove()
. Соответствует errno EISDIR
.
NotADirectoryError
:
Исключение NotADirectoryError
возникает, когда совершается попытка операции с каталогом, например os.listdir()
, а на самом деле путь не является каталогом. Соответствует errno ENOTDIR
.
PermissionError
:
Исключение PermissionError
поднимается при попытке запустить операцию без соответствующих прав доступа — например, прав доступа к файловой системе. Соответствует errno EACCES
и EPERM
.
ProcessLookupError
:
Исключение ProcessLookupError
поднимается, когда данный процесс не существует. Соответствует errno ESRCH
.
TimeoutError
:
Исключение TimeoutError
поднимается, когда время ожидания системной функции на системном уровне. Соответствует errno ETIMEDOUT
.
1. Purpose
In this post, I would demo how to solve the below exception or error when using python:
Traceback (most recent call last):
File "generate_png_transparent_demo.py", line 43, in <module>
generate_png_transparent("./images/a.png","hello world")
File "generate_png_transparent_demo.py", line 37, in generate_png_transparent
d.text((10,25), the_text, fill=(255, 0, 0),font=get_font(the_text))
File "generate_png_transparent_demo.py", line 21, in get_font
font = ImageFont.truetype("arial.ttf", fontsize)
File "/Users/bswen/.pyenv/versions/3.7.6/lib/python3.7/site-packages/PIL/ImageFont.py", line 852, in truetype
return freetype(font)
File "/Users/bswen/.pyenv/versions/3.7.6/lib/python3.7/site-packages/PIL/ImageFont.py", line 849, in freetype
return FreeTypeFont(font, size, index, encoding, layout_engine)
File "/Users/bswen/.pyenv/versions/3.7.6/lib/python3.7/site-packages/PIL/ImageFont.py", line 210, in __init__
font, size, index, encoding, layout_engine=layout_engine
OSError: cannot open resource
2. The Environment
- Python 3
- MacOS
3. The code
3.1 The project directory structure
Our working directory name is myscript, this is the structure of it:
.
└── myscripts/
├── images/
│ ├── readme.txt
└── generate_png_transparent_demo.py
Explain as follows:
- The images directory is a target directory that we would put our result image into it
- The
generate_png_transparent_demo.py
is the file that do the magic
3.2 The code that cause the problem
def get_font():
font = ImageFont.truetype("arial.ttf", fontsize)
According to the ImageFont.truetype’s documentation, the first parameter of the function is the font file name, just as follows:
- font – A truetype font file. Under Windows, if the file is not found in this filename, the loader also looks in Windows
fonts/
directory.
When we run the above code, we get this error:
...
font = ImageFont.truetype("arial.ttf", fontsize)
File "/Users/bswen/.pyenv/versions/3.7.6/lib/python3.7/site-packages/PIL/ImageFont.py", line 852, in truetype
return freetype(font)
File "/Users/bswen/.pyenv/versions/3.7.6/lib/python3.7/site-packages/PIL/ImageFont.py", line 849, in freetype
return FreeTypeFont(font, size, index, encoding, layout_engine)
File "/Users/bswen/.pyenv/versions/3.7.6/lib/python3.7/site-packages/PIL/ImageFont.py", line 210, in __init__
font, size, index, encoding, layout_engine=layout_engine
OSError: cannot open resource
You can see the program is complaining that it can not find the font file on the system.
3.3 The solution
We should tell python where to load the font file , just as follows:
def get_font(txt, img_fraction=0.05):
font = ImageFont.truetype("/Library/fonts/Arial.ttf", fontsize)
Re-run the program, no errors again.
3.4 Why?
On windows system, python PIL libraray would find the font file in system font directories, but on MacOS, it seems that the library can not find the font file by itself.
Where is the font file on Mac?According to Mark Setchell and Nathaniel, the files are located at :
/System/Library/Fonts
/Library/Fonts
you can check in both at the same time from Terminal:
$ find {/System,}/Library/Fonts -name *ttf
5. Summary
In this post, we demonstrated how to use solve the system font file problem when using PIL in python, you can see that the PIL is not very compatible with MacOS, there is a trick on this job. Thanks for your reading. Regards.
- Recreate
OSError: [Errno 8] Exec format error
in Linux - Add
#!/bin/sh
to FixOSError: [Errno 8] Exec format error
in Linux - Use
sh
to FixOSError: [Errno 8] Exec format error
in Linux
The subprocess
module in Python allows you to run commands by creating new processes. When running a shell script using its methods, sometimes you may get an OSError: [Errno 8] Exec format error
in Linux.
The problem Exec format error
is raised when the script is directly run and not through the correct interpreter. It occurs if there is no shebang line at the beginning of the script file.
This tutorial will teach you to fix Linux’s OSError: [Errno 8] Exec format error
.
Recreate OSError: [Errno 8] Exec format error
in Linux
First, let’s recreate OSError: [Errno 8] Exec format error
in Linux.
The following is a Bash script myshell.sh
that returns Welcome to DelftStack Tutorials
.
echo "Welcome to DelftStact Tutorials"
Below is a Python script, myscript.py
, that runs the above script using subprocess.Popen()
.
import subprocess
shell_file = '/home/delft/myshell.sh'
P = subprocess.Popen(shell_file)
Run the Python script in the terminal.
python3 script.py
Output:
Traceback (most recent call last):
File "myscript.py", line 3, in <module>
P = subprocess.Popen(shell_file)
File "/usr/lib/python3.8/subprocess.py", line 858, in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
File "/usr/lib/python3.8/subprocess.py", line 1704, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
OSError: [Errno 8] Exec format error: '/home/delft/myshell.sh'
As you can see, it returns the error OSError: [Errno 8] Exec format error
.
Add #!/bin/sh
to Fix OSError: [Errno 8] Exec format error
in Linux
The best way to solve this issue is by adding #!/bin/sh
at the top of the shell script file myshell.sh
. It ensures that the system uses the right interpreter to run the .sh
script.
Edit the myshell.sh
file with any editor and add the below lines.
#!/bin/sh
echo "Welcome to DelftStack Tutorials"
Now run the Python script to see the result.
python3 myscript.py
Output:
Welcome to DelftStack Tutorials
Use sh
to Fix OSError: [Errno 8] Exec format error
in Linux
You can also specify sh
in Python script in the command that runs the shell script file.
Here is an example of it.
import subprocess
shell_file = '/home/delft/myshell.sh'
P = subprocess.Popen(['sh', shell_file])
Next, run the Python script file.
python3 myscript.py
Output:
Welcome to DelftStack Tutorials
Now you know how to solve OSError: [Errno 8] Exec format error
and run shell scripts using Python in Linux. We hope you find this tutorial helpful.