TypeError while checking for permissions with os.access() on windows xp

ryniek90 ryniek90 at gmail.com
Sat Aug 22 11:00:41 EDT 2009


> First, some nitpicking: Include the whole traceback when posting about
> errors please.  Don't write "if some_boolean_expression != True:"
> instead prefer "if not some_boolean_expression:".  Also, in your code
> "except (Except), ex: return ex" the parentheses are redundant,
> there's no "Except" Exception (unless you created one yourself) and
> why are you catching and returning the Exception object?  (Also,
> what's that "sys.exit(0)" doing in there? And why exit with 0 if there
> was a problem? Exit code 0 means "no problem".)
>
>
> Second, from what you've said backup_dest must be None:
>
>   
>>>> import os
>>>> os.access(None, os.W_OK)
>>>>         
>
> Traceback (most recent call last):
>   File "<pyshell#1>", line 1, in <module>
>     os.access(None, os.W_OK)
> TypeError: coercing to Unicode: need string or buffer, NoneType found
>
>   

No, backup_dest is destination for backup. It's this variable: 
*backup_dest = self.__backup_dest* .
*self.__backup_dest = os.getenv('HOME')*  -  as you can see, 
self.__backup_dest is a reference to the home directory which is a 
string. Then backup_dest is a reference to the variable 
self.__backup_dest. But that second reference seems to be recognised as 
a NoneType ??

I'm using optparse in my script (that code for checking for permission 
is a part of my backup script).

Maybe i post my complete code:
"
#!/usr/bin/env python
#-*- coding: utf-8 -*-
#MyBackUper

import os, sys, tarfile
import datetime
from optparse import OptionParser


class Except(Exception):
    pass


class Packer(Except):

    def __init__(self):
        self.__backup_dest = os.getenv('HOME')
        __current_time = datetime.datetime.today().strftime('%Y-%m-%d 
%H:%M:%S')
        Except.__init__(self)

    def doc_note(self):

        print """

        DOCUMENTATION

        'Backuper' is a script for doing backups.
        You can backup with it single files or whole directories.
        For available commands type 'backuper.py -h' or 'backuper.py 
--help'.

        Using it is simple:

        - to backup single file, type:
        'backuper.py -f FILE_PATH BCKP_NAME [DEST_PATH]',
        where 'FILE_PATH' is exact path to prefered file which you want 
to backup and 'BCKP_NAME' is the name for backup output file. Default 
'DEST_PATH' is placed in home directory, it can't be changed. 
'BCKP_NAME' must be given;

        - to backup whole directory, type:
        'backuper.py -d DIR_PATH BCKP_NAME [DEST_PATH]', where 
'DIR_PATH' is exact path to prefered directory, which you want to backup 
and 'BCKP_NAME' is the name for backup output file. Default 'DEST_PATH' 
is placed in home directory, it can't be changed. 'BCKP_NAME' must be given;

        """

    def __check_set_perm(self, rd_obj_path, backup_dest):

        try:

            if os.path.exists(rd_obj_path):
                if not os.access(rd_obj_path, os.R_OK):
                    print "Have no permissions on [%s] for reading 
operation.\nTrying to set them..." % os.path.split(rd_obj_path)[1]
                    if not os.path.isdir(rd_obj_path):
                        os.chmod(rd_obj_path, stat.S_IREAD)
                    else:
                        for root, dirs, files in os.walk(rd_obj_path):
                            for f in files:
                                os.chmod(os.path.join(root, f), 
stat.S_IREAD)
                    print "Get permissions for reading on [%s] 
successfully." % os.path.split(rd_obj_path)[1]
                else:
                    print "Have permissions on [%s] for reading." % 
os.path.split(rd_obj_path)[1]

                if not os.access(backup_dest, os.W_OK):
                    print "Have no permissions on [%s] for writing 
operation.\nTrying to set them..." % os.path.split(backup_dest)[1]
                    os.chmod(backup_dest, stat.S_IWRITE)
                    print "Get permissions for reading on [%s] 
successfully." % os.path.split(backup_dest)[1]
                else:
                    print "Have permissions on [%s] for writing." % 
os.path.split(backup_dest)[1]
            else:
                return "Can't find specified path - [%s]." % rd_obj_path
                sys.exit(1)

        except (Except), ex:
            return ex


    def backup_file(self, rd_obj_path, bkp_obj_name):

        try:

            if os.name == "nt":
                rd_obj_path = rd_obj_path.replace('~/', '%s\\' % 
os.getenv('HOME')).replace('\\', '\\\\')
                backup_dest = self.__backup_dest
                print "Checking permissions for reading and writing..."
                self.__check_set_perm(rd_obj_path, backup_dest)
                backup_obj = tarfile.open("%s\\%s(%s).tar.bz2" % 
(backup_dest, bkp_obj_name, __current_time), 'w:bz2')

            else:
                rd_obj_path = rd_obj_path.replace('~/', '%s/' % 
os.getenv('HOME'))
                backup_dest = self.__backup_dest
                print "Checking permissions for reading and writing..."
                self.__check_set_perm(rd_obj_path, backup_dest)
                backup_obj = tarfile.open("%s/%s(%s).tar.bz2" % 
(backup_dest, bkp_obj_name, __current_time), 'w:bz2')

            print "Preparing for backup [%s]..." % 
os.path.split(rd_obj_path)[1]
            print "Starting backup..."
            read_obj = open(rd_obj_path, 'rb')
            print "Now adding [%s]..." % os.path.split(rd_obj_path)[1]
            backup_obj.add(read_obj.read())
            read_obj.close(), backup_obj.close()
            print "Backup [%s] made successfully. :-)" % 
os.path.split(backup_dest)[1]

        except (Except), ex:
            return ex

    def backup_dir(self, rd_obj_path, bkp_obj_name):

        try:

            if os.name == "nt":
                rd_obj_path = rd_obj_path.replace('~/', '%s\\' % 
os.getenv('HOME')).replace('\\', '\\\\')
                backup_dest = self.__backup_dest
                print "Checking permissions for reading and writing..."
                self.__check_set_perm(rd_obj_path, backup_dest)
                backup_obj = tarfile.open("%s\\%s(%s).tar.bz2" % 
(backup_dest, bkp_obj_name, __current_time), 'w:bz2')

            else:
                rd_obj_path = rd_obj_path.replace('~/', '%s/' % 
os.getenv('HOME'))
                backup_dest = self.__backup_dest
                print "Checking permissions for reading and writing..."
                self.__check_set_perm(rd_obj_path, backup_dest)
                backup_obj = tarfile.open("%s/%s(%s).tar.bz2" % 
(backup_dest, bkp_obj_name, __current_time), 'w:bz2')

            print "Preparing for backup '%s'..." % 
os.path.split(rd_obj_path)[1]
            print "Gathering files for backup..."
            path_list = []
            for root, dirs, files in os.walk(rd_obj_path):
                for f in files:
                    path_list.append(os.path.join(root, f))
            print "Starting backup..."
            for p in path_list:
                fl = open(p, 'rb')
                print "Now adding [%s] from [%s] directory" % 
(os.path.split(p)[1], os.path.split(p)[0])
                backup_obj.add(fl.read())
                fl.close()
                print "Added [%s] successfully" % os.path.split(p)[1]
            backup_obj.close()
            print "Backup [%s] made successfully. :-)" % 
os.path.split(backup_dest)[1]

        except (Except), ex:
            return ex


class ParseIt(object):

    def __init__(self):
        self.__initial = True

    _usage = "usage: %prog [options] Arg1 Arg2"
    parser = OptionParser(_usage)
    parser.add_option("-f", "--file", action="store", type="string", 
dest="filename", help="Make backup of a single file", metavar="FILE_PATH 
CKP_NAME", nargs=2)
    parser.add_option("-d", "--dir", action="store", type="string", 
dest="dirname", help="Recursively backup a whole directory", 
metavar="DIR_PATH BCKP_NAME", nargs=2)
    parser.add_option("-i", "--info", dest="info_note", 
action="store_true", help="Show script's documentation")

    (options, args) = parser.parse_args()

def main_meth():
    paq = Packer()
    pars = ParseIt()
    if pars.options.filename:
        paq.backup_file(pars.options.filename[0], pars.options.filename[1])
    elif pars.options.dirname:
        paq.backup_dir(pars.options.dirname[0], pars.options.dirname[1])
    elif pars.options.info_note:
        paq.doc_note()


if __name__ == "__main__":
    main_meth()

"





More information about the Python-list mailing list