Adapting code to multiple platforms

J

Jeffrey Barish

I have a small program that I would like to run on multiple platforms
(at least linux and windows). My program calls helper programs that
are different depending on the platform. I think I figured out a way
to structure my program, but I'm wondering whether my solution is good
Python programming practice.

Most of my program lives in a class. My plan is to have a superclass
that performs the generic functions and subclasses to define methods
specific to each platform. I envision something like this:

class super:
'''All the generic stuff goes here'''

class linux_subclass(super):
def func(self):
'''linux-specific function defined here'''

class windows_subclass(super):
def func(self):
'''windows-specific function defined here'''

And then in main I have:

inst = eval('%s_subclass' % sys.platform)(args)

to create an instance of the appropriate subclass.

I realize that I will have to name the subclasses appropriately
depending on what values get assigned to sys.platform. (On my platform,
sys.platform is 'linux2', so I would actually need class
linux2_subclass(super). I don't know what value gets assigned on a
windows platform.)

The other way I thought of -- surrounding all the platform-specific code
with if statements to test sys.platform -- seems clearly worse. I'm
just getting up to speed on Python and OOP, so I'm wondering whether I
have missed something obvious. I'm hoping that the strongest rebuke
would be that I found something obvious.
 
J

Jeremy Bowers

Most of my program lives in a class. My plan is to have a superclass
that performs the generic functions and subclasses to define methods
specific to each platform....
I'm just getting up to speed on Python and OOP, so I'm wondering whether I
have missed something obvious. I'm hoping that the strongest rebuke
would be that I found something obvious.

You may be interested to know this is called the Template Pattern.

http://home.earthlink.net/~huston2/dp/templateMethod.html

Generally, while most of the patterns are obvious in hindsight they are
not necessarily obvious in advance, and I consider independently
re-discovering a pattern is a good sign; it's much easier to correct not
knowing about them than gaining the skills to independently re-derive them.
 
S

Simon John

If you're using a GUI, then that may help you decode the platform too -
for example wxPython has wx.Platform, there's also platform.platform()
, sys.platform and os.name

You could try import win32api and checking for an exception ;-)
 
P

Peter Hansen

Simon said:
If you're using a GUI, then that may help you decode the platform too -
for example wxPython has wx.Platform, there's also platform.platform()
, sys.platform and os.name

You could try import win32api and checking for an exception ;-)

(Winky noted) Just in case anyone thinks that last is a
useful idea, keep in mind that win32api is not installed
(with the standard distribution) but must be installed
with a separate download of the pywin32 package by Mark
Hammond.

-Peter
 
P

Patrick Useldinger

Jeffrey said:
I have a small program that I would like to run on multiple platforms
(at least linux and windows). My program calls helper programs that
are different depending on the platform. I think I figured out a way
to structure my program, but I'm wondering whether my solution is good
Python programming practice.

I use something like this in the setup code:

if os.name == 'posix':
statfunction = os.lstat
else:
statfunction = os.stat

and then further in the code:

x = statfunction(filename)

So the idea is to have your "own" function names and assign the
os-specific functions one and for all in the beginning. Afterwards, your
code only uses your own function names and, as long as they behave in
the same way, there's no more if - else stuff.

-pu
 
P

Paul Watson

Peter Hansen said:
(Winky noted) Just in case anyone thinks that last is a
useful idea, keep in mind that win32api is not installed
(with the standard distribution) but must be installed
with a separate download of the pywin32 package by Mark
Hammond.

-Peter

How about try: import msvcrt
 
P

Peter Hansen

Paul said:
How about try: import msvcrt

Sure, that works, but it would make for pretty
inscrutable code if you were doing this just to
check whether you were on Windows, and not because
you really intended to use the msvcrt module.

sys.platform exists for a good reason. Use it!
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,236
Members
46,821
Latest member
AleidaSchi

Latest Threads

Top