2010-09-07 20 views
9

Tengo una secuencia de comandos para informarme sobre todos los archivos, en un directorio, por lo que los usuarios deberán borrarlos (es realmente muy malo) clúster administrado, sin superusuario real). Cuando ejecuto el guión me sale: OSError: [Errno 13] Permiso denegado: ' ls:: Permiso denegado no puedo escribir el nombre dir (política de la empresa) El código es:Obtengo OSError: [Errno 13] Permiso denegado: <dir name>, y os.walk sale de

#!/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) 

La secuencia de comandos no envía el correo electrónico, pero muere. Gracias por ayudar a un newbe.

+2

Debe ejecutar esto a través de la secuencia de comandos pep8 y corregir el formateo ... – Daenyth

+1

No pegue todo el código al hacer una pregunta de todos modos: elimine las cosas irrelevantes, no espere que todos vayan a través de un código no relacionado. Y, por el bien de la cordura de todos, deje de usar "" "strings" "" en todas partes sin ningún motivo. –

Respuesta

2

Parece que su secuencia de comandos se ejecuta como un usuario normal y no tiene permiso para leer un directorio.

Ayudaría a ver el mensaje de error completo (incluso si se cambian los nombres de ruta), ya que nos indicaría en qué línea se estaba produciendo el error.

Pero básicamente, la solución es controlar la excepción en un 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) 

Especialmente a la luz del comentario de S. Lott, tenga en cuenta que los archivos o directorios que están causando OSErrors podrían ser precisamente los archivos cuyos propietarios necesita enviar un correo electrónico a. Pero para leer dentro de sus directorios, es posible que su script deba ejecutarse con privilegios de superusuario (o intensificado).

+1

Además, eso hace que sea una posible pregunta de http://superuser.com, ya que se trata de permisos, no de Python. –

Cuestiones relacionadas