
Eu tenhoeste script 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','')
No entanto, quero poder chamar esse script usando uma variável para "abcd" para poder inserir qualquer combinação de letras em vez de "abcd" como "efgh", por exemplo.
Normalmente, posso usar um $@
ou $1
em vez de abcd
na última linha de um 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",'')
Mas quando executo o script usando algo como ./scriptname.py efgh
recebo:
$1
1$
em vez das permutações para "efgh".
Responder1
O equivalente python do parâmetro posicional array do shell $1
, $2
etc.sys.argv
Então:
#!/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],'')
então
$ ./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
Responder2
Muitas maneiras de parametrizar python. argumentos posicionais, variáveis de ambiente e argumentos nomeados. Variáveis ambientais:
importe os e use o getenv como:
fw_main_width =os.getenv('FW_MAIN_WIDTH', fw_main_width)
Onde o segundo parâmetro é o padrão para a variável env não estar definida.
Argumentos posicionais:
Use sys.argc, sys.argv[n] depois de importar sys.
Parâmetros nomeados:
Ou para parâmetros nomeados (o que você perguntou)
import argparse
em seguida, descreva os parâmetros possíveis:
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()
e use-os como args.width etc.
Responder3
Ok, descobri uma solução alternativa enquanto escrevia a pergunta, mas achei que isso seria útil para outros usuários, então aqui está.
Para python (python2), podemos usar raw_input()
em vez de, $1
mas funciona de maneira um pouco diferente. Em vez de inserir a entrada após o nome do script no bash, você será solicitado a inserir o valordepoisvocê executa o script.
Aqui está um exemplo:
#!/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: "),'')
A execução do script solicitará que o usuário "insira caracteres:". Depois que o usuário inserir os caracteres e pressionar ENTER, as permutações serão impressas no terminal.
Aqui está a fonte que também explica como fazer isso para python3.
Responder4
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()
Na linha de comando: FileName.py -l abcd