Pass a bash variable to python script

I have this python script:

#!/usr/bin/env python
def getPermutation(s, prefix=''):
        if len(s) == 0:
                print prefix
        for i in range(len(s)):
                getPermutation(s[0:i]+s[i+1:len(s)],prefix+s[i] )



getPermutation('abcd','')

However, I want to be able to call this script using a variable for "abcd" so I can insert any combination of letters instead of "abcd" like "efgh" for example.

Normally, I can use a $@ or $1 instead of abcd on the last line in a bash script like this:

#!/usr/bin/env python
def getPermutation(s, prefix=''):
        if len(s) == 0:
                print prefix
        for i in range(len(s)):
                getPermutation(s[0:i]+s[i+1:len(s)],prefix+s[i] )



getPermutation("$1",'')

But when I run the script using something like ./scriptname.py efgh I get:

$1
1$

instead of the permutations for "efgh".


Solution 1:

The python equivalent of the shell's positional parameter array $1, $2 etc. is sys.argv

So:

#!/usr/bin/env python

import sys

def getPermutation(s, prefix=''):
        if len(s) == 0:
                print prefix
        for i in range(len(s)):
                getPermutation(s[0:i]+s[i+1:len(s)],prefix+s[i] )



getPermutation(sys.argv[1],'')

then

$ ./foo.py abcd
abcd
abdc
acbd
acdb
adbc
adcb
bacd
badc
bcad
bcda
bdac
bdca
cabd
cadb
cbad
cbda
cdab
cdba
dabc
dacb
dbac
dbca
dcab
dcba

Solution 2:

Lots of ways to parameterize python. positional args, env variables, and named args. Env variables:

import os and use the getenv like:

fw_main_width  =os.getenv('FW_MAIN_WIDTH',  fw_main_width)  

Where the second parameter is the default for the env variable not being set.

Positional args:

Use the sys.argc, sys.argv[n] after you import sys.

Named parameters:

Or for named parameters,(what you asked)

 import argparse  

then describe the possible parameters:

parser = argparse.ArgumentParser(description = "Project", fromfile_prefix_chars='@')
parser.add_argument("-V", "--version", help="show program version", action="store_true")
parser.add_argument("-W", "--width", help="set main screen width")  
read arguments from the command line  

args = parser.parse_args()

and use them as args.width etc.