On Mon, 07 Dec 2009 21:13:25 -0000, J <dreadpiratej...@gmail.com> wrote:

Just a little newbie confusion about OS imports...

Why does this give me an error:

It's generally helpful to say *what* error you get, including the traceback. Fortunately the source code is enough this time.

class Windows:

    def __init__(self):
        '''
        Constructor
        '''
        import os
[snip the rest]

This is a bad idea for the reasons you explained yourself. This import statement goes off and loads the module "os" and binds it to the name "os". That name is local to Windows.__init__, just like any other name you'd bind here that wasn't explicitly declared to be global. What you actually want is for "os" to be a global name; there are a whole bunch of insane ways of doing that, but the usual and least confusing thing to do is:

import os

class Windows:
    def __init__(self):
        # Do stuff...

[the next function was]
   def parseDMI(self):
       # First, find dmidecode.exe
      for root,dirs,files in os.walk('C:\\'):
           for file in files:
               if file == "dmidecode.exe":
self.dmidecodePath=[os.path.normcase(os.path.join(root,file))]
return "Found DMIDecode.exe at %s" % self.dmidecodePath
                   break

I assume the formatting is the fault of some mailer somewhere trying to wrap the long line. Such is life.

The break after the return statement is a bit pointless, though. It's never going to get executed.

Also, when I DO have the import statement inside the function
definition, I'm screwing up the join and getting this:
"C:\\dmidecod\\sbin\\dmidecode.exe"

What am I doing that's creating the two \ characters??

At a guess, nothing. Would I be right in thinking that what you actually get is ['C:\\dmidecod\\sbin\\dmidecode.exe'] ? When you use string formatting with a list argument, the list turns itself into a string by calling repr() on its elements. repr() on a string produces something that you could cut and paste into code as a string literal; to do that without changing the meaning of the string, it escapes the backslashes with another backslash. You can play with this for yourself in the interactive shell:

rho...@gnudebst:~$ python
Python 2.6.4 (r264:75706, Nov  2 2009, 14:44:17)
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
print r"hello \ world"
hello \ world
s = r"hello \ world"
print s
hello \ world
print str(s)
hello \ world
print repr(s)
'hello \\ world'
a = [r"hello \ world"]
a
['hello \\ world']
print a
['hello \\ world']
print "message = %s" % a
message = ['hello \\ world']


So in my class, I import OS.  Now, in my calling script, do I also
import OS, or will I inheirit OS as part of the class object?

Since you don't bind the name "os" into your class (and you shouldn't, since that would definitely be a code smell), you aren't going to inherit it. Just import it where you need to and stop trying to make your life difficult! It doesn't in fact cost you anything, since Python caches the module the first time you load it precisely to avoid having to go back to the disc every time you want to reload it.

--
Rhodri James *-* Wildebeest Herder to the Masses
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to