Win32: Running python programs from a Cygwin shell

David Bolen db3l at fitlinxx.com
Tue Feb 17 00:53:28 EST 2004


JoeSmith <JoeSmith at IDontWantSpam.bogus.bogusaddress.com> writes:

> You could probably write a replacement for env that uses cygpath -m on
> the script file.  So, your env could call original env then do cygpath
> -m on the second paramter.  The one thing to think about is what the
> shell might do to other file/directory paramters passed to your
> script.  So, does it convert
> 
> 	foo.py .
> 
> into:
> 
> 	python /cygdrive/h/bin/foo.py python /cygdrive/h/bin/
> 
> Then your python script might not work.  So, do you run cygpath on all paramters?
> (...)
> The other option would be to write a special alias/script just for
> foo.py to handle on the oddities.  This is what I did to get it to
> execute gvim for win32.  I wrote a shell function to go through all
> paramters and run cygpath -m
> on everything that does not begin with a '-'.

That sounds very similar to how I have my system setup.  I've got bash
functions defined to translate just the first (non-option) argument to
Windows form for use from my bash prompt.  I haven't really found it
necessary to process all subsequent arguments (on the rare occasion I
need it I just use `cygpath` myself), and as you point out it might
adversely affect how the commands perceive the input.

I tend to run everything explicitly with "py##" aliases (or python)
from the command line because I bounce between python versions a lot,
so I don't depend on the Windows .py mapping, but presumably a similar
approach could work by an alias for "env".

So for example, my Python relevant section from my .bashrc:

          - - - - - - - - - - - - - - - - - - - - - - - - -

#
# Function to pre-process first argument (skipping past options) of a command
# with cygpath to translate paths to for Windows tools.
#
function wpath {
    typeset -i cmdstart=1
    local cmd=""
    local args=""

    while arg=${*:$cmdstart:1} && [ "${arg:0:1}" == "-" ]; do
	cmdstart=cmdstart+1
    done

    if [ $# -ge $cmdstart ]; then
        cmd=`cygpath -w ${*:$cmdstart:1}`
	args=${*:$((cmdstart+1))}
    fi

    echo ${*:1:$((cmdstart-1))} $cmd $args
}

#
# Function used to execute a command with its first argument translated to
# windows compatible paths.
#
function wcmd {
    $1 `wpath ${*:2}`
}

#
# Functions to run explicit Python versions as well as to establish a
# new default path.  Automatically use wpath when executing for path names.
#

function py15path
{
   export PATH=/c/python/1.5:/c/python/1.5/DLLs:$ORIGPATH
}
function py15
{
   PATH=/c/python/1.5:/c/python/1.5/DLLs:$ORIGPATH wcmd python $*
}

function py20path
{
   export PATH=/c/python/2.0:/c/python/2.0/DLLs:$ORIGPATH
}
function py20
{
   PATH=/c/python/2.0:/c/python/2.0/DLLs:$ORIGPATH wcmd python $*
}

function py21path
{
   export PATH=/c/python/2.1:/c/python/2.1/DLLs:$ORIGPATH
}
function py21
{
   PATH=/c/python/2.1:/c/python/2.1/DLLs:$ORIGPATH wcmd python $*
}

function py22path
{
   export PATH=/c/python/2.2:/c/python/2.2/DLLs:$ORIGPATH
}
function py22
{
   PATH=/c/python/2.2:/c/python/2.2/DLLs:$ORIGPATH wcmd python $*
}

function py23path
{
   export PATH=/c/python/2.3:/c/python/2.3/DLLs:$ORIGPATH
}
function py23
{
   PATH=/c/python/2.3:/c/python/2.3/DLLs:$ORIGPATH wcmd python $*
}

# And establish 'python' to filter through wcmd
alias python='wcmd python'

          - - - - - - - - - - - - - - - - - - - - - - - - -


-- David



More information about the Python-list mailing list