PDA

View Full Version : مشکل در تابع بازگشتی



code_baz
یک شنبه 01 خرداد 1390, 17:59 عصر
به کد زير نگاهي بندازيد

>>> def luanch(add):
import os
import re
for i in os.listdir(add):
path=os.path.join(add,i)
if not os.path.isdir(path):
try:
if re.findall('.+[.]{1}(.+)',path)[0] in \
['mp3','wma']:
d=raw_input('do u want ro play %s' % i)
if d=="y":
try:
os.startfile(path)
except:pass
if d=="q":return
except:pass
elif os.path.isdir(path):
luanch(path) # recursion

مشکل من در اينجا قطع برنامه هست
که حدودا در خط 17 اگر ورودي برابر با q باشه برنامه
return ميکنه ولي مشکل اينجاست که وقتي برنامه حالت بازگشتي پيدا ميکنه با وارد کردن q برنامه فقط از اون تابع دروني برگشت ميکنه و به کار خودش ادامه ميده
پيشنهادتون براي روش اتمام برنامه چيه؟

code_baz
یک شنبه 01 خرداد 1390, 18:08 عصر
توضیحات اضافه اینکه این اسکریپت دنبال فایلهایی با پسوند mp3 ,wma توی دیرکتوری داده شده میگرده و اونها رو launch میکنه و اگه پوشه ای پیدا کنه به صورت بازگشتی اونو میگرده

از exit() هم نمیخوام استفاده بکنم

Mehdi Asgari
یک شنبه 01 خرداد 1390, 19:31 عصر
دنبال حل کردن مشکل سورس کد فوق هستی یا میخوای روش صحیح تراورز کردن دایرکتوری ها رو یاد بگیری ؟
اگر دومی مد نظرته، قبلا در اینترنت در این مورد بحث شده
http://stackoverflow.com/questions/4918458/how-to-traverse-through-the-files-in-a-directory
http://hostcode.sourceforge.net/view/251
http://rosettacode.org/wiki/Walk_a_directory/Recursively
http://code.activestate.com/recipes/435875-a-simple-non-recursive-directory-walker/
pythonadventures.wordpress.com/2011/03/26/traversing-a-directory-recursively

code_baz
یک شنبه 01 خرداد 1390, 21:43 عصر
با traverse مشکلی نداشتم مشکل من این بود که چون از حالت بازگشتی استفاده کردم نمیتونستم از برنامه خارج بشم:
این الگوریتم خیلی بهتره:

import os
import re

def launch(Dir):
Dirs=[Dir]
while len(Dirs)>0:
dire=Dirs.pop()
for Iter in os.listdir(dire):
path=os.path.join(dire,Iter)
try:
if os.path.isfile(path) and re.findall('.+[.]{1}(.+)',path)[0] in ['mp3','wma']:
d=raw_input('do u want to play %s ,to quit enter q?' %path)
if d=='y':
os.startfile(path)
elif d=='q':return
elif os.path.isdir(path):
Dirs.append(path)
except:pass