[Python编程(第4版)].(Programming.Python.4th.Edition).Mark.Lutz.文字版

(yzsuai) #1

Example 5-36 collects in a single module many of the techniques we’ve met in this
chapter. It implements an abstract superclass, LaunchMode, which defines what it means
to start a Python program named by a shell command line, but it doesn’t define how.
Instead, its subclasses provide a run method that actually starts a Python program ac-
cording to a given scheme and (optionally) define an announce method to display a
program’s name at startup time.


Example 5-36. PP4E\launchmodes.py


"""
###################################################################################
launch Python programs with command lines and reusable launcher scheme classes;
auto inserts "python" and/or path to Python executable at front of command line;
some of this module may assume 'python' is on your system path (see Launcher.py);


subprocess module would work too, but os.popen() uses it internally, and the goal
is to start a program running independently here, not to connect to its streams;
multiprocessing module also is an option, but this is command-lines, not functions:
doesn't make sense to start a process which would just do one of the options here;


new in this edition: runs script filename path through normpath() to change any
/ to \ for Windows tools where required; fix is inherited by PyEdit and others;
on Windows, / is generally allowed for file opens, but not by all launcher tools;
###################################################################################
"""


import sys, os
pyfile = (sys.platform[:3] == 'win' and 'python.exe') or 'python'
pypath = sys.executable # use sys in newer pys


def fixWindowsPath(cmdline):
"""
change all / to \ in script filename path at front of cmdline;
used only by classes which run tools that require this on Windows;
on other platforms, this does not hurt (e.g., os.system on Unix);
"""
splitline = cmdline.lstrip().split(' ') # split on spaces
fixedpath = os.path.normpath(splitline[0]) # fix forward slashes
return ' '.join([fixedpath] + splitline[1:]) # put it back together


class LaunchMode:
"""
on call to instance, announce label and run command;
subclasses format command lines as required in run();
command should begin with name of the Python script
file to run, and not with "python" or its full path;
"""
def init(self, label, command):
self.what = label
self.where = command
def call(self): # on call, ex: button press callback
self.announce(self.what)
self.run(self.where) # subclasses must define run()
def announce(self, text): # subclasses may redefine announce()


264 | Chapter 5: Parallel System Tools

Free download pdf