Форум сайта python.su
Привет.
Решил потестить свои навыки понимания рекурсии на примере самописного скриптика на Python for s60.
Но столкнулся с какой-то странной проблемой: при запуске скрипта идёт сканирование всех дисков (C:, D:, E:, Z:), но при сканировании диска E: скрипт просто напросто вылетает, вместе с IDE.
В качестве IDE используется kaapython последней на сегодняшний день версии.
В то же время запущена последняя Opera Mobile с открытым локально .mht файликом порядка 500Кб.
В последнем Ped вообще какая-то ошибка кодировок, поэтому не гонял.
Так же, при обычном запуске из PythonShell - тоже ошибка кодировки. Но это не суть.
Ну и да, Python у меня установлен 1.4.5 Final.
Привожу полный код скрипта, а так же упрощённую версию:
Полная версия для дебага:
# -*- coding: utf-8 -*-
# Рабочий скрипт рекурсивного
# прохода папок по указанному пути.
# В подсчете не учитывает (пока) только
# исходный путь.
import os, e32, sys
sys.setrecursionlimit(5000)
#drives = e32.drive_list()
drives = [u'E:']
stat = {
# 'drives': 0,
'dirs': 0,
'files': 0,
'others': 0,
}
level = 0
def rec(pt):
global dirs, level
level += 1
if level > 10:
u'WARNING: deep recursion level:', level
names = os.listdir(pt)
for name in names:
d = os.path.join(pt, unicode(name))
if os.path.isdir(d):
stat['dirs'] += 1
rec(d)
elif os.path.isfile(d):
stat['files'] += 1
else:
stat['others'] += 1
level -= 1
for dr in drives:
for k, v in stat.items():
print k.capitalize() + u':', v
print u'Scanning', dr + u'...'
rec(dr)
import os
level = 0
def rec(pt):
global level
level += 1
print level
names = os.listdir(pt)
for name in names:
d = os.path.join(pt, unicode(name))
if os.path.isdir(d):
rec(d)
level -= 1
rec(u'E:')
Офлайн
Вылетает с ошибкой? Нужна ошибка.
Офлайн
Нет, `вылетает` - означает вообще вылетает, вместе с интерпретатором или IDE, в которой запускается.
В живом девайсе, не в эмуляторах.
Если бы с ошибкой - я бы разобрался и сам ;)
Взгляните на код. Может, где потестить сможете и отписаться.
Сегодня что-то другое делал ещё, уже не с рекурсиями, но с циклами связанное - не помню уже, что. Тоже вылетело. Так же, без ошибок, предупреждений.
Ах, да, кстати, IDE помечено как системное приложение, которое, по идее, не должно закрываться ни по красной кнопке, ни при нехватке оперативы. Вот!
Офлайн
Я в свое время тоже пытался попрактиковаться с рекурсией. Вот небольшой рабочий примерчик. Ошибка здесь выскочила из-за отсутствия сертификата у Python'а (не пускает его в системные папки) :(
—–
Код не комментировал, вроде бы и так понятно
—–
Python 2.5.4 (r254:67916, Nov 6 2009, 04:18:57) [C] on symbian_s60
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> import os
>>> files, dirs = 0x0, 0x0
>>> def scan(path=r'c:'):
... global files, dirs
... list = os.listdir(path)
... if len(list)>0:
... for name in list:
... tempPath = path+r'\\'+name
... if os.path.isfile(tempPath): files+=1
... if os.path.isdir(tempPath): dirs+=1; scan(tempPath)
... return
...
>>> scan()
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "<console>", line 8, in scan
File "<console>", line 3, in scan
OSError: [Errno 13] Permission denied: 'c:\\\\SYS'
>>> print files, dirs
10 23
>>>
Офлайн
я разобрался тогда еще.
у меня, оказывается, имена файлов с непонятными символами были – вот и выкидывало. А отказа в доступе вроде не было. Уже и не вспомню.
Офлайн
У меня такие же вылеты были, когда я писал свой скрипт рекурсии. Я думал как узнать почему вылетает и вписал в скрипт код, который записывал каждую просканированную директорию в текстовый файл. А после вылета я открывал это файл и смотрел на каком файле вылетел сканнер. Оказалось в названии одного файла была какая то одинарная кавычка, вроде этой ', но какая то кривая
Офлайн
во-во, такая же ерунда.
я даже с кодировками маялся – всё без толку :(
а на компьютере нормально всё. тут, наверное, косяк симбы или питона.
ах, да. .decode(“utf-8”, “ignore”) и “replace” – не работали тоже.
и у меня s60 v3 fp2 (5320 XM), прошивка 04.13 (04.13.C04.01), версия языка 05.01
Офлайн