Итак, у меня есть приложение Python, которое объединяется в .app с использованием py2app. У меня есть несколько отладочных операторов печати, которые обычно печатаются на стандартный вывод, если я запускаю код в терминале. Если я просто открою связанное .app, очевидно, я не увижу ничего из этого вывода. Что-то из этого на самом деле печатается где-то, хотя я этого не вижу?
Куда что-то печатает, когда приложение не запущено с терминала?
Ответы (3)
Он выходит на стандартный вывод (то есть в командную строку, если вы открываете его в командной строке, или, например, в журнал, если вы запускаете его с заданиями cron).
Для более продвинутого и гибкого использования попробуйте использовать встроенную поддержку ведения журнала (logging
модуль). . Он позволяет направлять сообщения на консоль, в файл, поток (например, внешний сервер регистрации), syslog
процесс, электронную почту и т. д., а также фильтровать на основе уровня сообщения журнала. Операторы отладки (операторы регистрации) могут быть помещены в производственный код, но настроены так, чтобы не вызывать никаких журналов, кроме ошибок. Очень полезно и значительно упрощает регистрацию.
Куда перенаправляются потоки stdout и stderr, зависит от того, как вы запускаете приложение и в какой версии OSX вы находитесь.
Когда вы запускаете приложение из терминала ("MyApp.app/Contents/MacOS/MyApp"), вывод заканчивается в окне терминала.
Когда вы запускаете приложение двойным щелчком или с помощью команды open(1), вывод заканчивается в Console.app при использовании OSX до 10.8 и отбрасывается в OSX 10.8.
У меня есть патч, который перенаправляет вывод в журналы, которые Console.app читает даже для OSX 10.8, но на данный момент его нет в выпущенной версии.
P.S. Я сопровождаю py2app.
Я думаю, вы можете взглянуть на модуль с именем logging.
Затем вы можете использовать этот модуль для записи собственных журналов в отдельный файл, например, так я это делаю:
import logging
# Create a log file for the future debug
LOG_FILE_NAME = 'my-script.log'
log_path = path = os.path.join(os.path.expanduser('~'), '/mnt/logs/')
if not os.path.exists(log_path):
os.makedirs(log_path)
logger = logging.getLogger('my-script')
logger.setLevel(logging.DEBUG)
file_handler = logging.FileHandler(log_path+LOG_FILE_NAME)
file_handler.setLevel(logging.DEBUG)
file_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(message)s')
file_handler.setFormatter(file_formatter)
logger.addHandler(file_handler)
class Foo()
def log(self, msg, level=None):
print "LOG %s" % msg
if level is not None:
if level == 'INFO':
logger.info(msg)
elif level == 'WARNING':
logger.warn(msg)
elif level == 'ERROR':
logger.error(msg)
elif level == 'CRITICAL':
logger.critical(msg)
else:
logger.debug(msg) # DEBUG
self.log('Some text here', 'DEBUG') # I use self.log instead of print
give standard handler
- person Vor; 09.07.2013
log_path = os.path.join(os.path.expanduser('~'), 'mnt/logs/')
, потому что если вы используете '/mnt/logs/'
, результат будет именно таким, поскольку он имеет ведущую косую черту.
- person martineau; 09.07.2013
NullHandler
, и объяснение, почему его не следует настраивать так, как вы предложили: docs.python.org/2/howto/
- person Tadeck; 09.07.2013
logging
, но пробовали ли вы искать в Console.app? - person Wooble   schedule 09.07.2013