From fperez at colorado.edu  Tue Jan  6 17:17:34 2004
From: fperez at colorado.edu (Fernando Perez)
Date: Tue, 06 Jan 2004 15:17:34 -0700
Subject: [IPython-dev] Shell capture magic introduced
Message-ID: <3FFB33FE.1000103@colorado.edu>

Hi all,

after reading over all of your feedback (many thanks to all who responded) and 
actually needing the functionality for some work today, I decided to implement 
the shell capture system as a magic function.  This cleans up the code (no new 
special syntax to worry about), and it makes the feature nicely fit within the 
existing framework.

I called it sc (short for shell capture), deliberately choosing a very short 
name to minimize typing.  This is a compromise to having a special syntax, 
which I feel balances well typing efficiency with simplicity.

I've put the code already into CVS, and removed the exploratory $var=cmd 
functionality.  Below is how it currently works, copied straight from an 
ipython session.  Comments and suggestions are welcome before the 0.6 release.

Regards,

Fernando.


############# IPython session output:

In [1]: pdoc sc
Shell capture - execute a shell command and capture its output.

@sc [options] varname=command

IPython will run the given command using commands.getoutput(), and
will then update the user's interactive namespace with a variable
called varname, containing the value of the call.  Your command can
contain shell wildcards, pipes, etc.

The '=' sign in the syntax is mandatory, and the variable name you
supply must follow Python's standard conventions for valid names.

Options:

   -l: list output.  Split the output on newlines into a list before
   assigning it to the given variable.  By default the output is stored
   as a single string.

   -v: verbose.  Print the contents of the variable.

In [2]: sc a=ls *sin*

In [3]: sc -v a=ls *sin*
a ==
'ftest_sin16_1d.c\nftest_sin_1d.c\nftest_sin2_1d.c\nftest_sin2_2d.c\nftest_sin2_3d.c\nftest_sin_2d.c\nftest_sin_3d.c\nftest_sin64_1d.c'

In [4]: sc -l -v a=ls *sin*
a ==
['ftest_sin16_1d.c',
  'ftest_sin_1d.c',
  'ftest_sin2_1d.c',
  'ftest_sin2_2d.c',
  'ftest_sin2_3d.c',
  'ftest_sin_2d.c',
  'ftest_sin_3d.c',
  'ftest_sin64_1d.c']

# You can capture a file as lines trivially:

In [5]: sc -l -v g=cat ftest_gauss_sharp_1d.c
g ==
['#include <math.h>',
  '',
  'static double dsqrarg;',
  '#define DSQR(a) ((dsqrarg=(a)) == 0.0 ? 0.0 : dsqrarg*dsqrarg)',
  '',
  '// Globals',
  'const double alpha = 100000;  // Width of the Gaussian',
  '',
  '#define FUNCTION_NAME ftest_gauss_sharp',
  '#define NDIM 1',
  '',
  'double FUNCTION_NAME(double x) {',
  '  double r2 = DSQR(x-0.5);',
  '  return exp(-alpha*r2);',
  '}']

# You can even use pipes:

In [14]: sc -v a=grep NAME *.c | grep const
a ==
'ftest_const_1d.c:#define FUNCTION_NAME ftest_const\nftest_const_1d.c:double 
FUNCTION_NAME(double x) {'