2010-09-07 13 views
9

Mam skrypt, który informuje mnie o wszystkich plikach, w katalogu, aby użytkownicy musieli je usunąć (to naprawdę źle zarządzany klaster, bez prawdziwego superużytkownika). Kiedy uruchomić skrypt uzyskać: OSError: [ERRNO 13] Permission denied: " ls:: Permission denied nie mogę napisać nazwę dir (polityka firmy) Kod jest:Otrzymuję OSError: [Errno 13] Odmowa uprawnień: <dir name>, a os.walk wychodzi

#!/depot/Python-3.1.1/bin/python3.1 
from stat import * 
import stat 
import sys 
from collections import defaultdict 
from pwd import getpwuid 
import sys 
sys.path.append('/remote/us01home15/ldagan/python') 
import mailer 
import os 
import re 
import glob 
import subprocess 
import pwd 
def find_owner(file): 
    return pwd.getpwuid(os.stat(file)[stat.ST_UID]).pw_name 
if (len(sys.argv) < 1): 
    sys.error('''Please input <runda number> <case number>''') 
files_by_users=defaultdict(list) 
runda_num="".join(sys.argv[1]) 
dir_basic='/berry/secure' 
case_num="".join(sys.argv[2]) 
secure_dir="".join([dir_basic,"/"]) 
i=1 
dirs=[] 
runda_case_dir="".join([dir_basic,'/',runda_num,'/',case_num ]) 
while (os.path.exists(secure_dir)): 
    if (os.path.exists(runda_case_dir)): 
     dirs.append(runda_case_dir) 
    i+=1 
    secure_dir="".join([dir_basic,str(i)]) 
    runda_dir="/".join([secure_dir,runda_num,case_num]) 

#now finding list of 
manager_email='[email protected] [email protected]' 
def bull (msg): 
    i=1 


for dir in dirs: 
    for root,dirs,files in os.walk(dir,onerror=bull): 
     for file in files: 
      file_full_name=os.path.join(root,file) 
      files_by_users[find_owner(file_full_name)].append(file_full_name) 
for username in files_by_users: 
     sendOffendingNotice(username, file_by+users[username], manager_email) 

def sendOffendingNotice(username,filenames,managerEmail): 
    """gets file name & manager Email 
     sends an Email to the manager for review. As there are no smtp 
     definitions, mailx shall be used""" 
    user_email=username+'@synopsys.com' 
    message="""The following files \n""" + """\n""".join(filenames) +"""\n""" + \ 
    """ which belongs to user """ + username +""" does not meet the required names's SPEC\nPlease keep it under a directory which has a proper case/star name\n""" 
    message= """echo \"""" + message+ """" | mailx -s "Offending files" """ + managerEmail +" " #+user_email 
    process=subprocess.Popen(message,shell=True) 

Skrypt nie wysyła e-maila, ale umiera. Dzięki za pomoc nowemu.

+2

Powinieneś uruchomić to poprzez skrypt pep8 i naprawić formatowanie ... – Daenyth

+1

Nie wklejaj całego kodu, gdy zadajesz pytanie w każdym razie - usuń nieistotne rzeczy, nie oczekuj, że wszyscy będą brnąć przez niepowiązany kod. I proszę, dla dobra zdrowego rozsądku, przestańcie używać "" "długich łańcuchów" "" wszędzie bez powodu. –

Odpowiedz

2

Wygląda na to, że Twój skrypt działa jako zwykły użytkownik i nie ma uprawnień do odczytu katalogu.

Pomoże to wyświetlić pełny komunikat o błędzie (nawet jeśli nazwy ścieżek zostaną zmienione), ponieważ informuje nas, w którym wierszu wystąpił błąd.

Ale w zasadzie rozwiązaniem jest pułapką wyjątek w try...except block:

try: 
    # Put the line that causes the exception here 
    # Do not trap more lines than you need to. 
    ... 
except OSError as err: 
    # handle error (see below) 
    print(err) 

Zwłaszcza w świetle komentarza S.Lott jest pamiętać, że pliki lub katalogi, które powodują OSErrors może być precyzyjnie pliki, których właściciele musisz wysłać e-mail do. Ale aby przeczytać wewnątrz swoich katalogów, skrypt może wymagać uruchomienia z uprawnieniami administratora (lub podwyższonymi).

+1

Co więcej, jest to możliwe pytanie http://superuser.com, ponieważ dotyczy ono uprawnień, a nie Pythona. –

Powiązane problemy