Уведомления

Группа в Telegram: @pythonsu

#1 Июль 20, 2011 07:08:01

Chrizt
От: Владивосток
Зарегистрирован: 2009-07-18
Сообщения: 88
Репутация: +  0  -
Профиль   Отправить e-mail  

Вылет скрипта при рекурсивном исследовании папок

Привет.

Решил потестить свои навыки понимания рекурсии на примере самописного скриптика на 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:')



Офлайн

#2 Июль 20, 2011 11:14:12

Lolka
От:
Зарегистрирован: 2007-09-29
Сообщения: 128
Репутация: +  0  -
Профиль   Отправить e-mail  

Вылет скрипта при рекурсивном исследовании папок

Вылетает с ошибкой? Нужна ошибка.



Офлайн

#3 Июль 21, 2011 02:01:55

Chrizt
От: Владивосток
Зарегистрирован: 2009-07-18
Сообщения: 88
Репутация: +  0  -
Профиль   Отправить e-mail  

Вылет скрипта при рекурсивном исследовании папок

Нет, `вылетает` - означает вообще вылетает, вместе с интерпретатором или IDE, в которой запускается.
В живом девайсе, не в эмуляторах.
Если бы с ошибкой - я бы разобрался и сам ;)

Взгляните на код. Может, где потестить сможете и отписаться.

Сегодня что-то другое делал ещё, уже не с рекурсиями, но с циклами связанное - не помню уже, что. Тоже вылетело. Так же, без ошибок, предупреждений.

Ах, да, кстати, IDE помечено как системное приложение, которое, по идее, не должно закрываться ни по красной кнопке, ни при нехватке оперативы. Вот!



Офлайн

#4 Ноя. 22, 2011 09:54:36

SanchO-SEK
От:
Зарегистрирован: 2010-03-07
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Вылет скрипта при рекурсивном исследовании папок

Я в свое время тоже пытался попрактиковаться с рекурсией. Вот небольшой рабочий примерчик. Ошибка здесь выскочила из-за отсутствия сертификата у 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
>>>



Офлайн

#5 Ноя. 22, 2011 13:34:25

Chrizt
От: Владивосток
Зарегистрирован: 2009-07-18
Сообщения: 88
Репутация: +  0  -
Профиль   Отправить e-mail  

Вылет скрипта при рекурсивном исследовании папок

я разобрался тогда еще.
у меня, оказывается, имена файлов с непонятными символами были – вот и выкидывало. А отказа в доступе вроде не было. Уже и не вспомню.



Офлайн

#6 Ноя. 25, 2011 15:21:10

ReaL_HarDCorE
От:
Зарегистрирован: 2011-01-19
Сообщения: 84
Репутация: +  0  -
Профиль   Отправить e-mail  

Вылет скрипта при рекурсивном исследовании папок

У меня такие же вылеты были, когда я писал свой скрипт рекурсии. Я думал как узнать почему вылетает и вписал в скрипт код, который записывал каждую просканированную директорию в текстовый файл. А после вылета я открывал это файл и смотрел на каком файле вылетел сканнер. Оказалось в названии одного файла была какая то одинарная кавычка, вроде этой ', но какая то кривая



Офлайн

#7 Ноя. 26, 2011 12:09:16

Chrizt
От: Владивосток
Зарегистрирован: 2009-07-18
Сообщения: 88
Репутация: +  0  -
Профиль   Отправить e-mail  

Вылет скрипта при рекурсивном исследовании папок

во-во, такая же ерунда.
я даже с кодировками маялся – всё без толку :(
а на компьютере нормально всё. тут, наверное, косяк симбы или питона.

ах, да. .decode(“utf-8”, “ignore”) и “replace” – не работали тоже.

и у меня s60 v3 fp2 (5320 XM), прошивка 04.13 (04.13.C04.01), версия языка 05.01



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version