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