
Tengoeste script en Python:
#!/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','')
Sin embargo, quiero poder llamar a este script usando una variable para "abcd" para poder insertar cualquier combinación de letras en lugar de "abcd" como "efgh", por ejemplo.
Normalmente, puedo usar $@
o $1
en lugar de abcd
en la última línea en un script bash como este:
#!/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",'')
Pero cuando ejecuto el script usando algo como ./scriptname.py efgh
obtengo:
$1
1$
en lugar de las permutaciones de "efgh".
Respuesta1
El equivalente en Python de la matriz de parámetros posicionales del shell $1
, $2
etc. essys.argv
Entonces:
#!/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],'')
entonces
$ ./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
Respuesta2
Muchas formas de parametrizar Python. argumentos posicionales, variables env y argumentos con nombre. Variables ambientales:
importe el sistema operativo y use getenv como:
fw_main_width =os.getenv('FW_MAIN_WIDTH', fw_main_width)
Donde el segundo parámetro es el predeterminado para la variable env que no se establece.
Argumentos posicionales:
Utilice sys.argc, sys.argv[n] después de importar sys.
Parámetros nombrados:
O para parámetros con nombre (lo que preguntaste)
import argparse
luego describa los posibles parámetros:
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()
y usarlos como args.width, etc.
Respuesta3
Bien, descubrí una solución mientras escribía la pregunta, pero sentí que sería útil para otros usuarios, así que aquí está.
Para Python (python2), podemos usar raw_input()
en lugar de $1
pero funciona un poco diferente. En lugar de ingresar la entrada después del nombre del script en bash, se le solicitará que ingrese el valordespuésejecutas el script.
Aquí hay un ejemplo:
#!/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(raw_input("enter characters: "),'')
Al ejecutar el script, el usuario deberá "ingresar caracteres:". Después de que el usuario ingrese los caracteres y luego presione ENTER, las permutaciones se imprimirán en la terminal.
Aquí está la fuente que también explica cómo hacer esto para python3.
Respuesta4
import itertools, argparse
def main():
parser = argparse.ArgumentParser()
parser.add_argument('-l', '--letters', dest='letters', type=str, help='Letters to iterate over')
options = parser.parse_args()
a = [''.join(i) for i in itertools.permutations(options.letters)]
print(a)
if __name__ == '__main__': main()
En la línea de comando: NombreDeArchivo.py -l abcd