Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > unicode .. снова


Автор: amar0k 15.7.2009, 12:14
имеем програмку, которая бежит по заданым папкам и создает на все файлы линки в другом месте. файлы на английском русском и иврите.
если запускать из терминала  или через ГУИ программы - все путем

но если задать автозапуск через crontab - все время вылетает :
Код


Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python2.6/threading.py", line 522, in __bootstrap_inner
    self.run()
  File "/home/shatun/workspace/QtTM/src/qttm.py", line 451, in run
    for root, dirs, files in os.walk(lastBackUp+src): #@UnusedVariable
  File "/usr/lib/python2.6/os.py", line 294, in walk
    for x in walk(path, topdown, onerror, followlinks):
  File "/usr/lib/python2.6/os.py", line 294, in walk
    for x in walk(path, topdown, onerror, followlinks):
  File "/usr/lib/python2.6/os.py", line 284, in walk
    if isdir(join(top, name)):
  File "/usr/lib/python2.6/posixpath.py", line 70, in join
    path += '/' + b
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 1: ordinal not in range(128)


падает соответственно тут: for root, dirs, files in os.walk(lastBackUp+src)
обе переменныe могут быть на любом из 3-х языков.
все в юникоде.

почему падает ТОЛЬКО  при вызове через crontab ??

Автор: powerfox 25.7.2009, 14:18
Цитата(amar0k @  15.7.2009,  13:14 Найти цитируемый пост)
почему падает ТОЛЬКО  при вызове через crontab ?? 

Вы уверены, что без кронтаба проверили на всех языках?
Попробуйте так: 
Код

for root, dirs, files in os.walk(unicode(lastBackUp+src, 'utf-8'))

Автор: amar0k 29.8.2009, 14:37
unicode(lastBackUp+src, 'utf-8') - тоже не сработал.

а вот string.encode('utf-8') для каждой строки, что передается параметром в os.walk()  и os.path.join() таки помогло.
хотя странно, при запуске в живую никаких проблем небыло.. нашел еще несколько топиков в гугле с такой же проблемой.. 
но в любом случае для меня этот "костыль" подходит smile







рано обрадовался.. после пары тестов снова стали вылетать ... мля

Автор: av0000 30.8.2009, 10:05
Цитата(amar0k @  29.8.2009,  14:37 Найти цитируемый пост)
рано обрадовался.. после пары тестов снова стали вылетать ... мля


Аналогичная ситуация... (Ubuntu 8.10) Даже хуже - похоже, "теряется" stdout.
По симптомам - если для запущенного процесса не создана нормальная консоль, ему сильно всё урезается. В данном случае, похоже, выставляется локаль по-умолчанию "ascii". Возможно, спасут глобальные установки LANG, LC_ALL и т.п.

Для себя решал запуском через su - с лишним bash-ем в памяти готов мириться...

Автор: amar0k 2.9.2009, 15:11
Цитата(av0000 @  30.8.2009,  10:05 Найти цитируемый пост)
Для себя решал запуском через su - с лишним bash-ем в памяти готов мириться... 


можно поподробнее? 

Автор: av0000 2.9.2009, 15:58
Цитата(amar0k @  2.9.2009,  15:11 Найти цитируемый пост)
можно поподробнее?  


Было как-то так:
Код

0/15 * * * * su - -c '~/py/bot.py 2&> ~/py/log/bot.log'


НО! Поскольку падения таки не совсем прекратились (там, правда exception-ы ещё были виноваты), переделал весь вывод на logging с передачей имени файла лога как параметра. Да и редирект stderr-а, показалось, не(-всегда) срабатывает. Можно, конечно, помудрить с подменой stdout, но лень и стандартнее сделать через logging:
Код

log = logging.getLogger() # !!! Global

def initLog(logfile):
    global log
    if not logfile:
        h = logging.StreamHandler(strm=sys.stderr)
    else:
        h = logging.FileHandler(logfile)

    h.setFormatter(logging.Formatter("%(asctime)s %(levelname)s: %(message)s","%d.%m.%Y %H:%M:%S"))
    log.addHandler(h)
    log.setLevel(logging.DEBUG)

if __name__=="__main__":
    logfile = None
    try:
        opts, args = getopt.getopt(sys.argv[1:], "hl:", ["help","log="])
        for o,a in opts:
            if o in ('-h', '--help'):
                print_help()
                sys.exit(0)
            elif o in ('-l','--log'):
                logfile = a

    except getopt.GetoptError, err:
        print "invalid switch. %s" % (err,)
        print_help()
        sys.exit(1)
    except:
        pass

    initLog(logfile)
    log.info("Logging enabled!")
       #...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)