I get OSError: [Errno 13] Permission denied: <dir name>, and os.walk exits
Asked Answered
J

1

9

I have a script to report me about all files, in a directory, so that users will be required to erase them (it's a really badly managed cluster, w/o real superuser). When I run the script I get: OSError: [Errno 13] Permission denied: ' ls: : Permission denied I can't write the dir name (company policy) The code is:

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

The script does not send the Email, but dies. Thanks for helping a newbe.

Jan answered 7/9, 2010 at 16:42 Comment(2)
You should run this through the pep8 script and fix the formatting...Outfield
Don't paste your entire code when asking a question anyway--remove the irrelevant stuff, don't expect everyone else to wade through unrelated code. And please, for the sake of everyone's sanity, stop using """long strings""" everywhere for no reason.Dollar
V
2

It sounds like your script is running as a normal user, and does not have permission to read a directory.

It would help to see the full error message (even if path names are changed), since it would tell us on which line the error was occurring.

But basically the solution is to trap the exception in a 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)

Especially in light of S.Lott's comment, note that the files or directories which are causing OSErrors might be precisely the files whose owners you need to send email to. But in order to read inside their directories your script may need to run with superuser (or heightened) privileges.

Vaginectomy answered 7/9, 2010 at 17:18 Comment(1)
Also, that makes this a possible superuser.com question, since it's about permissions, not Python.Knot

© 2022 - 2024 — McMap. All rights reserved.