2.2. Метод check_output()
Вышеупомянутые методы выполняют успешно переданную команду оболочки, но не дают пользователю свободы манипулировать способом получения вывода. Для этого на должен метод подпроцесса .
Метод выполняет переданную команду, но вместо возврата статуса выхода на этот раз возвращает объект.
Присмотритесь к приведенному ниже примеру, где мы снова пытаемся установить модуль (уже установленный).
import subprocess command = "pip install pymysql" #command to be executed res = subprocess.check_output(command) #system command print("Return type: ", type(res)) #type of the value returned print("Decoded string: ", res.decode("utf-8")) #decoded result
Выход:
Return type: <class 'bytes'> Decoded string: Requirement already satisfied: pymysql in c:\users\sneha\appdata\local\programs\python\python37-32\lib\site-packages (0.9.3)
Здесь, как и в предыдущих случаях, хранит объект, возвращаемый методом . Мы видим, что подтверждает, что объект имеет тип.
После этого печатаем декодированную строку и видим, что команда успешно выполнена.
sys.path
Значение функции path модуля sys – это список строк, которые указывают путь поиска для модулей. Как правило, данная функция указывает Python, в каких локациях смотреть, когда он пытается импортировать модуль. В соответствии с документацией Python, sys.path инициализируется из переменной окружения PYTHONPATH, плюс зависимое от установки значение, указанное по умолчанию. Давайте взглянем на пример:
Python
import sys
print(sys.path)
1 2 |
importsys print(sys.path) |
Результат:
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
», ‘C:\\Python27\\Lib\\idlelib’, ‘C:\\Python27\\lib\\site-packages\\setuptools-0.9.5-py2.7.egg’, ‘C:\\Python27\\lib\\site-packages\\pip-1.3.1-py2.7.egg’, ‘C:\\Python27\\lib\\site-packages\\sphinx-1.2b3-py2.7.egg’, ‘C:\\Python27\\lib\\site-packages\\docutils-0.11-py2.7.egg’, ‘C:\\Python27\\lib\\site-packages\\pygments-1.6-py2.7.egg’, ‘C:\\Windows\\system32\\python27.zip’, ‘C:\\Python27\\DLLs’, ‘C:\\Python27\\lib’, ‘C:\\Python27\\lib\\plat-win’, ‘C:\\Python27\\lib\\lib-tk’, ‘C:\\Python27’, ‘C:\\Python27\\lib\\site-packages’, ‘C:\\Python27\\lib\\site-packages\\PIL’, ‘C:\\Python27\\lib\\site-packages\\wx-2.9.4-msw’ |
Данная функция может быть весьма полезной во время отладки причины, по которой модуль не импортируется. Вы также можете изменить путь. Так как данная функция является путем, мы можем добавлять или удалять путь из неё. Давайте взглянем на то, как добавлять путь:
Python
sys.path.append(«/path/to/my/module»)
1 | sys.path.append(«/path/to/my/module») |
Удаление пути я оставлю как задание для читателя
Оператор break в Python
Break – это ключевое слово в Python, которое используется для вывода управления программой из цикла. Оператор break разрывает циклы один за другим, т. е. в случае вложенных циклов сначала прерывает внутренний цикл, а затем переходит к внешним циклам. Другими словами, мы можем сказать, что break используется для прерывания текущего выполнения программы, и управление переходит к следующей строке после цикла.
Break обычно используется в тех случаях, когда нужно разорвать цикл для заданного условия.
Синтаксис разрыва приведен ниже.
#loop statements break;
Пример 1:
list = count = 1; for i in list: if i == 4: print("item matched") count = count + 1; break print("found at",count,"location");
Выход:
item matched found at 2 location
Пример 2:
str = "python" for i in str: if i == 'o': break print(i);
Выход:
p y t h
Пример 3: оператор break с циклом while.
i = 0; while 1: print(i," ",end=""), i=i+1; if i == 10: break; print("came out of while loop");
Выход:
0 1 2 3 4 5 6 7 8 9 came out of while loop
Пример 4:
n=2 while 1: i=1; while i<=10: print("%d X %d = %d\n"%(n,i,n*i)); i = i+1; choice = int(input("Do you want to continue printing the table, press 0 for no?")) if choice == 0: break; n=n+1
Выход:
2 X 1 = 2 2 X 2 = 4 2 X 3 = 6 2 X 4 = 8 2 X 5 = 10 2 X 6 = 12 2 X 7 = 14 2 X 8 = 16 2 X 9 = 18 2 X 10 = 20 Do you want to continue printing the table, press 0 for no?1 3 X 1 = 3 3 X 2 = 6 3 X 3 = 9 3 X 4 = 12 3 X 5 = 15 3 X 6 = 18 3 X 7 = 21 3 X 8 = 24 3 X 9 = 27 3 X 10 = 30 Do you want to continue printing the table, press 0 for no?0
Изучаю Python вместе с вами, читаю, собираю и записываю информацию опытных программистов.
Модуль Python Sys
Функции python Модуль предоставляет позволяет нам работать в базовом интерпретатере, независимо от того, что он является платформой Windows, Macintosh или Linux. В этом уроке мы рассмотрим эти функции и что мы можем сделать с этим.
Python Import Sys.
Давайте начнем наше путешествие с этими функциями и какую информацию они предлагают
Обратите внимание, что перед запуском любых функций нам нужно импортировать его с помощью команды ниже
import sys
Python Sys.modules.
Эта функция дает имена существующих модулей Python Текущая оболочка, импортирована. Давайте выполним это в системе:
>>> sys.modules.keys() dict_keys()
Я удалил много модулей, как изначально Python импортирует много модулей по умолчанию. Таким образом, выход может отличаться, когда вы выполните эту команду в настройке Python.
Python sys.argv.
Эта функция собирает струнные аргументы, переданные скрипту Python. Давайте выполним это в системе, сделав скрипт:
import sys print('The command line arguments are:') for i in sys.argv: print(i)
Запустите этот скрипт на терминале сейчас:
Python Sysspath.
Эта функция просто отображает установить в текущей системе. Давайте выполним это в системе, сделав скрипт:
import sys print('\n\nThe PYTHONPATH is', sys.path, '.\n')
Запустите этот скрипт на терминале сейчас:
Python Sys.Stdin.
Эта функция используется для принятия. Давайте выполним это в системе, сделав скрипт:
import sys user_input = sys.stdin.readline() print("Input : " + user_input)
Запустите этот скрипт на терминале сейчас:
Это, вероятно, наиболее часто используемая функция в модуле SYS, так как это стандартный способ принять вход от пользователя.
Python sys.copyright.
Эта строка просто отображает информацию об авторских правах на установленной в данный момент Python. Давайте выполним это в системе, сделав скрипт:
import sys print(sys.copyright)
Запустите этот скрипт на терминале сейчас:
Python Sys.exit.
Этот метод заставляет интерпретатор Python выходить в текущий поток выполнения резко. Давайте выполним это в системе, сделав скрипт:
import sys print("JournalDev") sys.exit(1) print("Hello")
Запустите этот скрипт на терминале сейчас:
Python sys.getrefcount.
Этот метод Module Python Sys возвращает количество ссылок на объект, в котором он используется. Python отслеживает это значение, как, когда это значение достигает 0 в программе, очищена память для этой переменной. Давайте выполним это в системе, сделав скрипт:
import sys variable = "JournalDev" print(sys.getrefcount(0)) print(sys.getrefcount(variable)) print(sys.getrefcount(None))
Запустите этот скрипт на терминале сейчас:
В этом уроке мы узнали о различных функциях, предоставленных Модуль в Python и увидел, как они работают. Увидеть больше уроков на Python здесь Отказ
Ссылка: API док
Сравнение функции sys.exit с другими функциями в python
Еще два способа – exit() и quit(). Но они не должны использоваться в производственной среде, потому что они используют модуль сайта , который установлен не везде.
Другой распространенный способ существования-это использование os._exit(). Итак, давайте посмотрим, в чем разница между ними.
метод os._exit() обычно используется для выхода из процесса с заданным статусом без вызова каких-либо обработчиков очистки, промывки буферов stdio и т. Д. Кроме того, он ничего не возвращает.
Примечание: Этот метод обычно используется в дочернем процессе после операционной системы.системный вызов вилки. Поэтому os._exit следует использовать только в некоторых специальных сценариях.
Таким образом, лучший способ выхода из программы-это sys.exit().
Основы использования оператора import и переменной sys.path
В соответствии с документацией Python, оператор ищет корректный модуль или пакет для импорта в соответствии со следующими правилами.
Технически документация Python является неполной
На самом деле интерпретатор ищет не только файл (то есть, модуль) с именем , также он будет искать папку (то есть, пакет) с именем .Обратите внимание, что интерпретатор Python сначала ищет список встроенных модулей, то есть модулей, которые интегрированы непосредственно в интерпретатор Python. Состав списка встроенных модулей зависит от типа установки и может быть найден в файлах (для Python версии и )
Обычно встроенные модули, которые входят с состав начальной установки, включают в себя (всегда устанавливается), , и и другие.
В отличие от встроенных модулей (модулей стандартной библиотеки), пути к которым помещаются первыми в списке для поиска при импорте остальные модули в стандартной библиотеке Python появляются после пути каталога текущего скрипта. Это приводит к запутанному поведению: становится возможно «заменить» некоторые, но не все модули в стандартной библиотеке Python.Например, на моем компьютере (Windows 10, Python 3.6) модуль является встроенным модулем, тогда как модуль нет. Таким образом, в будет импортировать модуль из стандартной библиотеки, а не мой собственный файл , находящийся в тот же каталоге.А оператор в будет импортировать мой файл , а не модуль из стандартной библиотеки.
Кроме того, оператор чувствителен к регистру символов в названии импортируемого файла. — это не то же самое, что .
Функция (Python и ) может использоваться для получения списка всех импортируемых модулей по заданному пути:
import pkgutil # установите значение переменной search_path равным None, чтобы увидеть все модули, импортируемые из sys.path search_path = '.' all_modules = for x in pkgutil.iter_modules(path=search_path)] print(all_modules)
Блок try…finally
Python предоставляет оператор finally, который используется по желанию с оператором try. Он выполняется независимо от того, какое исключение возникает и используется для освобождения внешнего ресурса. Блок finally обеспечивает гарантию выполнения.
Мы можем использовать блок finally с блоком try, в котором мы можем выполнить необходимый код до того, как оператор try вызовет исключение.
Синтаксис для использования блока finally:
try: # block of code # this may throw an exception finally: # block of code # this will always be executed
Пример:
try: fileptr = open("file2.txt","r") try: fileptr.write("Hi I am good") finally: fileptr.close() print("file closed") except: print("Error")
Выход:
file closed Error
sys.stdin / stdout / stderr
Stdin, stdout и stderr сопоставляются с файловыми объектами, которые соответствуют стандартным входам, выходам и потокам ошибок интерпретатора соответственно. Функция stdin используется для всех входов, используемых интерпретатором, за исключением скриптов, тогда как stdout используется для выходов операторов print и expression
Главная причина, по которой я акцентирую на этом внимание, заключается в том, что в какой-то момент вам нужно будет перенаправить stdout или stderr, или обе функции к файлу, такому как log, либо же какой-либо дисплей в пользовательском графическом интерфейсе, созданным вами. Вы также можете перенаправить stdin, но с такими случаями я практически не сталкивался
Перенаправление в файл
Мы можем перенаправить дескрипторы файлов , и в любой другой файл (дескриптор файла). Это может быть полезно, если вы хотите регистрировать события в файле без использования какого-либо другого модуля, такого как Logging.
Приведенный ниже фрагмент перенаправляет вывод ( ) в файл с именем .
Итак, мы не увидим ничего, напечатанного в консоли, потому что теперь это печатается в самом файле! В этом суть перенаправления вывода. Вы «перенаправляете» вывод в другое место. (На этот раз в , а не в консоль)
import sys # Save the current stdout so that we can revert sys.stdou after we complete # our redirection stdout_fileno = sys.stdout sample_input = # Redirect sys.stdout to the file sys.stdout = open('Output.txt', 'w') for ip in sample_input: # Prints to the redirected stdout (Output.txt) sys.stdout.write(ip + '\n') # Prints to the actual saved stdout handler stdout_fileno.write(ip + '\n') # Close the file sys.stdout.close() # Restore sys.stdout to our old saved file handler sys.stdout = stdout_fileno
Выход
root@ubuntu:~# python3 output_redirection.py Hi Hello from AskPython exit root@ubuntu:~# cat Output.txt Hi Hello from AskPython exit
Как видите, мы распечатали вывод как в консоль, так и в .
Сначала мы сохраняем исходный обработчик файла в другую переменную. Нам это нужно не только для восстановления в старом обработчике (указывающем на консоль), но мы также можем печатать на консоль, используя эту переменную!
Обратите внимание, что после записи в файл мы закрываем его, аналогично тому, как мы закрываем файл, потому что этот файл все еще был открыт. Наконец, мы восстанавливаем обработчик в консоли, используя переменную
Наконец, мы восстанавливаем обработчик в консоли, используя переменную .
Аналогичный процесс можно выполнить для перенаправления ввода и ошибок, заменив на или и работая с и исключениями вместо вывода.
Вызов исключений
Исключение можно вызвать принудительно, используя условие raise в Python. Это полезно в том случае, когда нам нужно вызвать исключение, чтобы остановить выполнение программы.
Например, есть программа, для выполнения которой требуется 2 ГБ памяти, и если программа пытается занять 2 ГБ памяти, мы можем вызвать исключение, чтобы остановить выполнение программы.
Синтаксис для использования оператора повышения приведен ниже.
raise Exception_class,<value>
Что нужно помнить:
- Чтобы вызвать исключение, используется оператор raise. За ним следует имя класса исключения.
- В качестве исключения можно указать значение, которое может быть указано в скобках.
- Для доступа к значению «as» используется ключевое слово. «e» используется как ссылочная переменная, в которой хранится значение исключения.
- Мы можем передать значение исключению, чтобы указать тип исключения.
Пример:
try: age = int(input("Enter the age:")) if(age<18): raise ValueError else: print("the age is valid") except ValueError: print("The age is not valid")
Вывод
Enter the age:17 The age is not valid
Пример вызова с сообщением
try: num = int(input("Enter a positive integer: ")) if(num <= 0): # we can pass the message in the raise statement raise ValueError("That is a negative number!") except ValueError as e: print(e)
Вывод
Enter a positive integer: -5 That is a negative number!
Еще пример
try: a = int(input("Enter a:")) b = int(input("Enter b:")) if b is 0: raise ArithmeticError else: print("a/b = ",a/b) except ArithmeticError: print("The value of b can't be 0")
Вывод
Enter a:10 Enter b:0 The value of b can't be 0
Типы аргументов в интерфейсе командной строки
Есть два аргумента, которые мы можем добавить к интерфейсу командной строки.
- Позиционный аргумент
- Необязательный аргумент
Давайте разберемся с обоими аргументами.
Позиционные аргументы – это типы аргументов, которые мы используем в команде для работы. Мы передаем аргумент команде и выполняем некоторые операции. Их положение определяется их функцией. Вот почему они называются позиционным аргументом.
По умолчанию позиционные аргументы обрабатываются как String, однако мы можем привести к другому типу данных.
В предыдущем примере мы использовали позиционные аргументы для выполнения операции сложения между двумя числами.
Давайте разберемся в следующем коде.
Пример – 1
import argparse parser = argparse.ArgumentParser() # By default, it treats input number as string parser.add_argument('num', help="Enter nmber to get square of it.") args = parser.parse_args() print(args.num**2)
Выход:
Мы прошли 15, и он вернул 1515, потому что argparse обрабатывается как строка. Мы можем исправить это с помощью атрибута type.
Пример –
import argparse parser = argparse.ArgumentParser() parser.add_argument('num', help="Enter number to get square of it.", type = int) args = parser.parse_args() print(args.num**2)
Выход:
Теперь мы получили желаемый результат.
Необязательный аргумент – необязательный аргумент не является обязательным. Мы не получим ошибку, если она не будет передана в скрипт. Эти типы аргументов начинаются с префикса – одинарного тире или двойного тире “-“. Нам нужно вызвать .add_parse() для передачи необязательных аргументов.
Давайте разберемся в следующем примере.
# importing argparse module import argparse parser = argparse.ArgumentParser() # creating two variables using the add_argument method parser.add_argument("--num1", help = "first number") parser.add_argument("--num2", help = "second number") parser.add_argument("--operation", help = "operation") args = parser.parse_args() print(args.num1) print(args.num2) print(args.operation) n1 = int(args.num1) n2 = int(args.num2) if args.operation == "add": result = n1 + n2 print("The Result is : ",result) elif args.operation == "sub": result = n1 - n2 elif args.operation == "mul": result = n1 * n2 elif args.operation == "div": result = n1 / n2 else: print("Unmatched Argument") print("result is : ",result)
Когда мы запускаем приведенный выше код без передачи каких-либо аргументов, он покажет следующий результат.
Выход:
Как видно из приведенного выше кода, мы запустили скрипт без передачи каких-либо необязательных аргументов, и вместо того, чтобы возвращать ошибку, он ничего не возвращает. Типы справочного сообщения и данных для необязательных параметров такие же, как и в позиционных параметрах.
Перехват исключений
Если Вам не подходит стандартное поведение языка при возникновении исключений – остановка выполнения, Вы можете перехватить исключение и обработать его. Для таких ситуаций и существует конструкция try except. Данный механизм Python позволяет контролировать непредвиденные ситуации и действовать исходя из новых условий. Проиллюстрируем это используя предыдущий пример:
Копировать
Несколько блоков except
Можно использовать несколько блоков except и обрабатывать в каждом блоке отдельный вид ошибки. Немного перепишем программу из предыдущего примера:
Копировать
Хорошей практикой является написание сперва блоков для конкретных ошибок, а затем для общих случаев, поскольку всех ситуаций не предусмотреть:
Копировать
Вложенные блоки и else
Блоки try-except можно вкладывать друг в друга, если в этом есть необходимость.
Здесь же мы используем блок else. Этот блок должен содержать код, который выполнится если не возникнет исключений.
Копировать
Кстати, здесь допущена логическая ошибка. Найдёте?
Finally
Встречаются ситуации, когда необходимо выполнить какую-то часть кода в независимости от того, было исключение или нет. Для этого существует блок finally:
Копировать
Комбинирование необязательных и позиционных аргументов
Мы можем комбинировать как необязательные аргументы, так и аргументы позиции, используя argparse следующим образом.
Пример –
import argparse parser = argparse.ArgumentParser() # positionl Argument parser.add_argument('tutorial', help="Best Tutorial ") # optional argument parser.add_argument('-w', '--writer', help="Technical Content") args = parser.parse_args() if args.tutorial == 'Javatpoint': print('You made it!') if args.writer == 'Devansh': print('Technical Writer.')
Выход:
C:\Users\DEVANSH SHARMA\PycharmProjects\Elasticsearch>python code.py Javatpoint -w Devansh You made it! Technical Writer.
Мы передали оба типа аргументов в командную строку и получили результат, указанный выше.
Заключение
Мы обсудили наиболее важные концепции модуля Python argparse. Мы узнали, как мы можем создавать и использовать их через интерфейс командной строки. Этот модуль помогает нам создавать понятные программы и предоставлять пользователям средства взаимодействия с нашим приложением.
Изучаю Python вместе с вами, читаю, собираю и записываю информацию опытных программистов.
Операционная система
Обратите внимание, что в первую очередь нам нужно импортировать модуль OS в нашу программу, только тогда мы можем выполнять любую из его функций
os.name
Эта функция дает имя импортируемого модуля OS. Это зависит от базовой операционной системы. В настоящее время он регистрирует «posix», «os2», «ce», «nt», «riscos» и «java».
Выполним это в системе:
>>> print(os.name) posix
Понятно, что это может выводить разные платформы на основе интерпретатора.
os.environ
Environ – это не функция, а параметр процесса, через который мы можем получить доступ к переменным среды системы.
import os output = os.environ print(output)
Когда мы запустим этот скрипт, на выходе будет следующее:
os.execvp
execvp функция – это один из способов запуска других команд в системе. Давайте посмотрим на фрагмент кода для этой функции:
import os program = "python" arguments = print(os.execvp(program, (program,) + tuple(arguments)))
Давайте посмотрим на фрагмент кода hello.py:
print('Hello')
Когда мы запустим этот скрипт, на выходе будет следующее:
os.getuid
Эта функция модуля os возвращает идентификатор пользователя или UID текущего процесса, как это известно в народе.
>>> os.getuid() 501
Эта функция модуля os возвращает идентификатор пользователя текущего процесса или UID, как это известно в народе.
Итак, текущий идентификатор процесса оболочки – 501.
os.rename
С помощью функции rename мы можем легко переименовать файл.
import os fileDir = "JournalDev.txt" os.rename(fd,'JournalDev_Hi.txt')
Обратите внимание, что для этого мы должны предоставить правильные разрешения нашему скрипту
os.system
Системная функция os позволяет нам запускать команду в скрипте Python, как если бы я запускал ее в своей оболочке. Например:
import os currentFiles = os.system("users > users.txt")
Когда я запустил этот скрипт, в том же каталоге был создан новый файл с именем users.txt и строкой содержимого как ‘shubham’, так как он также возвращается исходной оболочкой:
Обратите внимание, что это очень мощная команда, и ее следует использовать с осторожностью
os.error
Класс ошибок модуля os – это базовый класс для ошибок, связанных с вводом-выводом. Таким образом, мы можем отлавливать ошибки ввода-вывода, используя OSError в предложении except.
import os try: f = open('abc.txt', 'r') # file is missing except OSError: print('Error')
os.getpid
Эта функция возвращает текущий идентификатор процесса или PID, как это известно в народе.
>>> os.getpid() 71622
Итак, идентификатор пользователя текущего процесса оболочки – 71622.
os.listdir
Эта функция просто выводит список файлов и каталогов, имеющихся в текущем рабочем каталоге.
>>> import os >>> os.listdir()
Он возвращает повторяющийся список имен каталогов и файлов.
os.uname
Эта функция возвращает информацию, которая определяет текущую операционную систему, в которой она выполняется.
>>> os.uname() posix.uname_result(sysname='Darwin', nodename='Shubham.local', release='17.2.0', version='Darwin Kernel Version 17.2.0: Fri Sep 29 18:27:05 PDT 2017; root:xnu-4570.20.62~3/RELEASE_X86_64', machine='x86_64')
Сравнение import os.path и os
os.path странно работает на самом деле. Похоже, что в os комплекте идет подмодуль path, но на самом деле это обычный модуль, с которым работает sys.module для поддержки os.path. Перечислим, что происходит:
- Когда Python запускается, он загружает множество модулей в sys.module.
- Модуль os также загружается при запуске Python. Он назначает свой путь специфическому атрибуту модуля os.
- Он вводит sys.modules = path, чтобы вы могли импортировать os.path, как если бы это был подмодуль.
Оператор try-expect
Если программа Python содержит подозрительный код, который может вызвать исключение, мы должны поместить этот код в блок try. За блоком try должен следовать оператор except, который содержит блок кода, который будет выполнен, если в блоке try возникнет какое-либо исключение.
Синтаксис:
try: #block of code except Exception1: #block of code except Exception2: #block of code #other code
Пример 1.
try: a = int(input("Enter a:")) b = int(input("Enter b:")) c = a/b except: print("Can't divide with zero")
Выход:
Enter a:10 Enter b:0 Can't divide with zero
Мы также можем использовать оператор else с оператором try-except, в который мы можем поместить код, который будет выполняться в сценарии, если в блоке try не возникает исключения.
Синтаксис для использования оператора else с оператором try-except приведен ниже.
try: #block of code except Exception1: #block of code else: #this code executes if no except block is executed
Рассмотрим следующую программу.
Пример 2
try: a = int(input("Enter a:")) b = int(input("Enter b:")) c = a/b print("a/b = %d"%c) # Using Exception with except statement. If we print(Exception) it will return exception class except Exception: print("can't divide by zero") print(Exception) else: print("Hi I am else block")
Выход:
Enter a:10 Enter b:0 can't divide by zero <class 'Exception'>
Практические примеры использования функций sys.excepthook и sys.exc_info.
- ;
- ;
- ;
Использование для вывода сообщения об ошибке.
В представленном коде ниже, последняя инструкция может опустить имя исключения
Используйте такую конструкцию с крайней осторожностью, таким образом можно легко замаскировать реальную ошибку! Здесь можно использовать для вывода сообщения об ошибке, а затем повторно вызвать исключение, что позволяет вызывающей стороне также обработать исключение:
import sys try f = open('myfile.txt') s = f.readline() i = int(s.strip()) except OSError as err print("OS error: {0}".format(err)) except ValueError print("Не удалось преобразовать данные в целое число.") except print("Непредвиденная ошибка:", sys.exc_info()[]) raise
Обработчик, которому не нужно явно передавать исключение.
Есть моменты, когда предпочтителен явный обработчик исключений, либо для ясности кода, либо во избежание конфликтов с библиотеками, которые пытаются установить свои собственные . В этих случаях может быть создана общая функция-обработчик, которой не нужно явно передавать объект исключения, вызывая для извлечения текущего исключения для потока.
import sys import threading import time def with_exception(): exc_type, exc_value = sys.exc_info()[:2 print(f'{exc_type.__name__} => {exc_value} in {threading.current_thread().name}') def cause_exception(delay): time.sleep(delay) raise RuntimeError('Error message') def thread_target(delay): try cause_exception(delay) except RuntimeError with_exception() threads = threading.Thread(target=thread_target, args=(0.3,)), threading.Thread(target=thread_target, args=(0.1,)), for t in threads t.start() for t in threads t.join() # RuntimeError => Error message in Thread-2 # RuntimeError => Error message in Thread-1
В этом примере избегается введение циклической ссылки между объектом трассировки и локальной переменной в текущем кадре, игнорируя эту часть возвращаемого значения из . Если требуется трассировка, например чтобы ее можно было зарегистрировать явным образом удалите локальную переменную используя del, чтобы избежать циклов.
Перехват нажатия клавиш .
Пример перехвата исключения , которое возникает, когда пользователь нажимает клавишу прерывания программы, обычно это Ctrl+C или Delete.
Например, если запустить код, представленный ниже, то по нажатию Ctrl+C можно увидеть трассировку исключения .
>>> import time >>> while True ... time.sleep(5) ... # ^CTraceback (most recent call last): # File "<stdin>", line 2, in <module> # KeyboardInterrupt
А что делать, если не нужна трассировка, если программу прервал пользователь? Эти сведения пользователю не о чем не скажут, а в некоторых случаях могут испугать. Напишем функцию перехвата этого исключения, в которой вместо ошибок будем выводить «Программа завершена по нажатию CTRL+C».
>>> import time, sys # функция перехвата исключения 'KeyboardInterrupt' >>> def my_except_hook(exctype, value, traceback): ... if exctype == KeyboardInterrupt ... print("Программа завершена по нажатию CTRL+C") ... else ... sys.__excepthook__(exctype, value, traceback) ... # применим функцию перехвата `my_except_hook` >>> sys.excepthook = my_except_hook >>> while True ... time.sleep(5) ... # ^CПрограмма завершена по нажатию CTRL+C
Теперь по нажатию Ctrl+C выводится «Программа завершена по нажатию CTRL+C»
Все о __init__.py
Файл выполняет 2 функции.
- Преобразование папки со скриптами в импортируемый пакет модулей (до Python 3.3).
- Запуск кода инициализации пакета.
Преобразование папки сценариев в импортируемый пакет модулей
Как уже было сказано выше, любой каталог, содержащий файл с именем представляет собой пакет Python. Этот файл так же может быть пустым. Например, при запуске скрипта в Python 2.7 можно импортировать пакет , но не , так как в каталоге нет файла .
Это НЕ применимо к Python 3.3 и выше, благодаря принятию неявных пространств имен пакетов. В принципе, Python 3.3+ рассматривает все папки как пакеты, поэтому пустые файлы больше не нужны и могут быть опущены.
Например, представляет собой пространство имен пакета, поскольку в папке нет файла . Если мы запустим интерактивный интерпретатор Python версии 3.6 в каталоге , то получим следующий результат:
>>> import packB >>> packB <module 'packB' (namespace)>
Запуск кода инициализации пакета
В первый раз, когда вы импортируете пакет или один из его модулей, Python будет выполнять файл в корневой папке пакета, если этот файл существует. Все объекты и функции, определенные в , считаются частью пространства имен пакета.
Рассмотрим следующий пример.
Листинг файла :
def a1_func(): print("running a1_func()")
Листинг файла :
## этот импорт делает a1_func доступной напрямую из packA.a1_func from packA.a1 import a1_func def packA_func(): print("running packA_func()")
Листинг файла :
import packA # "import packA.a1" будет работать также packA.packA_func() packA.a1_func() packA.a1.a1_func()
Команда выведет следующее:
running packA_func() running a1_func() running a1_func()
Примечание: если в файле вызывается , и вы запускаете в командной строке команду , то НЕ будет вызван, хотя на первый взгляд кажется, что является частью пакета . Так происходит потому, что Python запускает скрипт (в нашем случае ), но содержащая его папка не является пакетом.
Что такое argparse в Python?
Python argparse – это модуль синтаксического анализа командной строки, который рекомендуется для работы с аргументом командной строки. Этот модуль был выпущен как часть стандартной библиотеки Python 20 февраля 2011 года.
Он похож на модуль getopt, но немного сложнее в использовании и требует большего количества строк кода для выполнения той же задачи. Однако модуль argparse является лучшей заменой модулей Python getopt и optparse. Он предоставляет несколько важных функций, которые приведены ниже.
- Позволяет нам использовать позиционный аргумент.
- Позволяет настраивать символы префикса.
- Он поддерживает переменное количество параметров для одной опции.
- Поддерживает подкоманды.
Запуск Python-скрипта с помощью Сron
Давай потестируем то, что у нас получилось на маленьком скрипте, который будет писать в файл дату и время его активации. Таким образом мы проверим как работает cron. Тестовый скрипт, который мы положим в корень папки проекта, у меня это /home/iakulshin/pipeline, заливаем через файловый менеджер filezilla и прочие, если вы хардкорный девопс-дата-инженер удачи вам с nano. Заливаем скрипт указанный ниже в нашу папку.
from datetime import datetime with open('test.txt', 'a+', encoding='utf-8') as file: file.write(datetime.today().strftime('%Y-%m-%d-%H-%M-%S') + '\n')
Давайте попробуем создать cron задание для тестового запуска. В целом нам будут нужны 2 команды:
crontab -l # выводит список текущих заданий crontab -e # открывает файл заданий crontab -r # удаляет файл задания Пишем в консоль crontab -e
Появлеятся файлик с крон задачами в редакторе nano. Наша задача установить задание, которое будет запускать наш скрипт каждую минуту.
* * * * * cd /home/iakulshin/pipeline && /home/iakulshin/pipeline/venv/bin/python3 test.py
sys.stdin
Модуль Python предоставляет нам все три файловых объекта для stdin, stdout и stderr. В качестве объекта входного файла мы используем . Это похоже на файл, где вы можете открывать и закрывать его, как и любые другие файлы в Python.
Давайте разберемся на простом примере:
import sys stdin_fileno = sys.stdin # Keeps reading from stdin and quits only if the word 'exit' is there # This loop, by default does not terminate, since stdin is open for line in stdin_fileno: # Remove trailing newline characters using strip() if 'exit' == line.strip(): print('Found exit. Terminating the program') exit(0) else: print('Message from sys.stdin: ---> {} <---'.format(line))
Вывод
Hi Message from sys.stdin: ---> Hi <--- Hello from AskPython Message from sys.stdin: ---> Hello from AskPython <--- exit Found exit. Terminating the program
Выше фрагмент кода продолжает чтение входных данных из и выводит сообщение на консоли ( ) до тех пор , слово не встречаются.
Примечание. Обычно мы не закрываем объект файла по умолчанию, хотя это разрешено. Итак, — допустимый код Python.
Теперь, когда мы немного знаем о , перейдем к .