Passe uma variável bash para o script python

Passe uma variável bash para o script python

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 $1em vez de abcdna ú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 efghrecebo:

$1
1$

em vez das permutações para "efgh".

Responder1

O equivalente python do parâmetro posicional array do shell $1, $2etc.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, $1mas 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

informação relacionada