- <html>
- <STYLE type="text/css">
- H1 {border-width: 1; border: solid}
- </STYLE>
- <title>Scripting Column as of $Date: 2004/08/20 $</title>
- <h1><center>Monthly Scripting Column for April</center></h1>
- <table border=0 width="100%">
- <tr><td width="70%">
- <p>Greetings!
- This continues a series of bulletins, in which we introduce
- one of the scripts that will be in a future release.
- <td>
- <table border=1 width="100%">
- <tr><td><i><font color="blue">Tip: don't like the output? Use 'p4 -G' output as input to your Python script, and format the data (or graph it) to your liking.</font></i>
- </table>
- </tr>
- </table>
- <hr>
- <h2>Today's script</h2>
- <p><b>Leverage off other work.</b>
- We hear this often, and say it in this column a lot, too.
- The most error-prone programming I encounter is data validation code.
- That's the stuff that
- reads input, validates it, etc. Any chance I get to use code
- that someone else has already created (and tested), I'll take.
- <p>
- To that end, there's a facility available to Python programmers
- for retrieving that data from a Perforce query without parsing
- through formatted output.
- This option, "p4 -G", retrieves Perforce data to be read
- by a Python program:
- <pre> p4 <font color="red">-G</font> clients | python program.py </pre>
- Today's example retrieves that output using the
- Python library routine, <em>os.popen</em>.
- <p>
- The "-G" option, which went between <em>p4</em> and <em>clients</em>,
- sets the output option to a binary format.
- That format is called "marshal", and is a representation
- of a Python variable or object.
- <p>
- You can read such output with this routine written in Python,
- which runs a Perforce command and
- returns the results of the 'p4' command. The results are
- easy for the Python programmer to use: an array of 'dict'
- objects.
- <pre>
- import os
- import marshal
- def runp4cmd(p4cmd):
- """ Return the output from the Perforce command,
- and assume that the user put the '-G' in the options
- to get us marshall output. We always return an array
- for the results."""
- fd = os.popen(p4cmd, 'r')
- results = []
- while 1:
- try:
- d = marshal.load(fd)
- results.append(d)
- except EOFError:
- break
- fd.close()
- return results <em># end of runp4cmd</em>
- clientList = runp4cmd('p4 -G clients')
- for c in clientList:
- print c['client']
- </pre>
- <p>
- In the following example, there's a reference to the Options field.
- (We normally think of it as a list of strings, since that's how the
- client spec is formatted when we run 'p4 client.')
- The first thing is to burst it into an array,
- <em>optionList</em>,
- so that we can search it easily.
- <hr>
- <pre>
- import marshal,os, pprint,sys
- from readp4marshal import runp4cmd
- # Task: determine which client specs have the option 'nocompress'set.
- #
- # status: tested on Win/2000 using python 2.0
- # num of calls to 'p4': 1
- clientList = runp4cmd("p4 -G clients")
- for c in clientList:
- optionList = c['Options'].split(' ')
- for o in optionList:
- if o == 'compress':
- print "%s: compression of data (default)" % c['client']
- if o == 'nocompress':
- print "%s: *no* compression of data" % c['client']
- </pre>
- <hr>
- <center><b>findnocompress.py</b></center>
- <hr>
- <small><p>Note: all the programs shown in these columns have been written four times: in Perl, in P4Perl, in Python, and in P4Ruby. Look into the Perforce example database for the other versions.</small>
- <br>
- <i><small>$Id: //guest/jeff_bowles/scripts/0430python.html#1 $</small>
- <br>© 2004 Perforce Corporation, Inc.</small></i>
- </html>
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 4420 | Jeff Bowles |
adding the beginnings of example "columns" for scripting examples. |
21 years ago |