Печать Python в stderr в генераторе - PullRequest
0 голосов
/ 29 октября 2011

Сборка python fuse fs, в моем генераторе readdir первой строкой кода является оператор print.Это никогда не появлялось на моей консоли.Я изменил его для печати в stderr, так как думал, что это проблема буферизации.По-прежнему нет выхода.

Я добавил ручную очистку к следующей строке - все еще ничего.

Я добавил time.sleep (3) к следующей строке, программа действительно спит.

def readdir(self, path, offset):
    print >> sys.stderr, 'Text'
    sys.stderr.flush()
    time.sleep(3)

Затем я продолжаю заполнять каталог другим кодом (yield fuse.Direntry). Я получаю вывод и могу выполнить команду ls в терминале, чтобы просмотреть содержимое моего смонтированного каталога fuse, но я хочу знать, почемуКоманда print не работает в этом генераторе.

Обновление

Для тех, кто борется:

def readdir(self, path, offset):
    print >> sys.stderr, 'Text'
    sys.stderr.flush()
    for o in os.listdir( "." + path ):
        yield fuse.Direntry(o)

Код.Он генерирует список файлов, и я могу перемещаться по нему.Это хорошо.Проблема в том, что я никогда не вижу появления «Текст», нигде в STDOUT, STDERR.

Я просто спрашивал, почему это происходит только в этом генераторе.Я могу поместить печать в другом месте в коде предохранителя и получить вывод очень хорошо.

1 Ответ

1 голос
/ 18 ноября 2011

Ваш код FUSE работает под управлением библиотеки FUSE, поэтому вы не можете быть уверены, что stdin, stdout и stderr - те, которые находятся в вашем терминальном сеансе. Вполне возможно, что генератор readdir вызывается с альтернативными std* потоками.

Поскольку вы говорите, что другие части вашего кода FUSE print без проблем, вы можете захотеть поставить префикс всех операторов print в сообщении журнала отладки (значение sys.stdout.isatty() или даже repr(sys.stdout) может быть удобно), чтобы помочь вам понять, что происходит.

...