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()

"



</div>

I don't know why you didn't immediately add a print statement just before the failing os.access(), once you saw the error message. You could have printed out both the formal parameter and the instance attribute.

Simple explanation: you probably don't have an environment variable named "HOME". I don't either, on Windows. You need to test for that, and put some error handling, so the lack of an environment variable won't crash your program.

> Then backup_dest is a reference to the variable self.__backup_dest. But that second reference seems to be recognised as a NoneType ??

backup_dest is a local variable which is a reference to whatever object self.__backup_dest referenced. That could be a very different thing. But in this case the subtlety isn't important -- they're both referencing None, which is the object returned by os.getenv() when the requested environment variable doesn't exist.

DaveA

Yes, You have right Dave.
This reference don't exist in windows's cmd.exe, but in IDLE does.

Check this out:

"
Microsoft Windows XP [Wersja 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\Adrian-Admin>python
ActivePython 2.6.2.2 (ActiveState Software Inc.) based on
Python 2.6.2 (r262:71600, Apr 21 2009, 15:05:37) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.getenv('HOME')
>>> print os.getenv('HOME')
None
>>>
"

And now output from IDLE:
"
Python 2.5.4 (r254:67916, Dec 23 2008, 15:10:54) [MSC v.1310 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.

   ****************************************************************
   Personal firewall software may warn about the connection IDLE
   makes to its subprocess using this computer's internal loopback
   interface.  This connection is not visible on any external
   interface and no data is sent to or received from the Internet.
   ****************************************************************
IDLE 1.2.4 >>> import os
>>> os.getenv('HOME')
'C:\\Documents and Settings\\Adrian-Admin'
>>>
"

WTF??
Why on IDLE it works, but when i run this script in cmd.exe, the os.getenv('HOME') goes NoneType?
I'm to newbie yet to understand this  :/

That's the example with Traceback:

"
C:\Documents and Settings\Adrian-Admin\Moje dokumenty\My Dropbox\Aplikacje\Moje_aplikacje\Pythonowe_aplikacje\Skrypty>python backuper.py -f E:\ISO\archlinux-2009.02-core-i686.img ArchLinBackup
Checking permissions for reading and writing...
Have permissions on [archlinux-2009.02-core-i686.img] for reading.
Traceback (most recent call last):
 File "backuper.py", line 200, in <module>
   main_meth()
 File "backuper.py", line 190, in main_meth
   paq.backup_file(pars.options.filename[0], pars.options.filename[1])
 File "backuper.py", line 111, in backup_file
   self.__check_set_perm(rd_obj_path, self._backup_dest)
 File "backuper.py", line 90, in __check_set_perm
   if not os.access(self._backup_dest, os.W_OK):
TypeError: coercing to Unicode: need string or buffer, NoneType found

C:\Documents and Settings\Adrian-Admin\Moje dokumenty\My Dropbox\Aplikacje\Moje_aplikacje\Pythonowe_aplikacje\Skrypty>
"

So....it's cmd.exe fault?
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to