Как выполнить одну последнюю функцию прежде чем быть уничтоженным в Python?

Похоже, что обычные подозреваемые, такие как pdfsharp и migradoc, не могут этого сделать (pdfsharp, только если у вас установлен Acrobat (Reader)).

Я нашел здесь

https://vishalsbsinha.wordpress.com/2014/05/06/how-to-programmatics-c-net-print-a-pdf-file-directly Код к принтеру /

готов к копированию / вставке. Он использует принтер по умолчанию и, насколько я вижу, он даже не использует никаких библиотек, напрямую отправляя PDF-байты на принтер. Поэтому я предполагаю, что принтер также должен поддерживать его, на одном 10-летнем принтере, который я тестировал, он работал безупречно.

Большинство других подходов - без коммерческих библиотек или приложений - требуют, чтобы вы рисовали себя в контексте устройства печати. Выполнимо, но потребуется время, чтобы разобраться и заставить его работать на всех типах принтеров.

23
задан Mark Amery 24 January 2018 в 22:38
поделиться

4 ответа

import time

try:
    time.sleep(10)
finally:
    print "clean up"

clean up
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
KeyboardInterrupt

Если вам нужно перехватить прерывания на уровне других ОС, посмотрите на модуль сигналов:

http://docs.python.org/library/signal.html

Пример сигнала

from signal import *
import sys, time

def clean(*args):
    print "clean me"
    sys.exit(0)

for sig in (SIGABRT, SIGBREAK, SIGILL, SIGINT, SIGSEGV, SIGTERM):
    signal(sig, clean)

time.sleep(10)
33
ответ дан 29 November 2019 в 01:10
поделиться

Вы можете использовать модуль atexit . С его помощью вы можете зарегистрировать функцию, которая будет вызываться при завершении программы. Пример отсюда: http://docs.python.org/library/atexit.html

try:
    _count = int(open("/tmp/counter").read())
except IOError:
    _count = 0

def incrcounter(n):
    global _count
    _count = _count + n

def savecounter():
    open("/tmp/counter", "w").write("%d" % _count)

import atexit
atexit.register(savecounter)

Вы также можете передать позиционные и ключевые параметры функции, которую хотите вызвать при завершении программы.

Обратите внимание, что есть несколько обстоятельств, перечисленных в документации, при которых ваш обработчик не будет вызван:

Примечание : функции, зарегистрированные через этот модуль, не вызываются, когда программа завершается сигналом, не обрабатываемым Python, когда обнаружена фатальная внутренняя ошибка Python или когда вызывается os._exit () .

11
ответ дан 29 November 2019 в 01:10
поделиться
import signal
import sys
import time

def cleanup(*args):
    print 'Exiting'
    sys.exit(0)

signal.signal(signal.SIGINT, cleanup)
signal.signal(signal.SIGTERM, cleanup)
while True:
    time.sleep(60)  # less busy loop
8
ответ дан 29 November 2019 в 01:10
поделиться

Используйте модуль atexit для регистрации функции, которая будет вызываться в конце.

import atexit
atexit.register(some_function)
3
ответ дан 29 November 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: