Übergeben Sie eine Bash-Variable an ein Python-Skript

Übergeben Sie eine Bash-Variable an ein Python-Skript

Ich habedieses Python-Skript:

#!/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','')

Ich möchte dieses Skript jedoch mithilfe einer Variablen für „abcd“ aufrufen können, sodass ich anstelle von „abcd“ eine beliebige Buchstabenkombination wie beispielsweise „efgh“ einfügen kann.

Normalerweise kann ich in der letzten Zeile eines Bash-Skripts wie folgt ein „ $@oder“ $1anstelle von verwenden:abcd

#!/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",'')

Aber wenn ich das Skript mit etwas wie ausführe, ./scriptname.py efgherhalte ich:

$1
1$

anstelle der Permutationen für „efgh“.

Antwort1

Das Python-Äquivalent des Positionsparameter-Arrays $1usw. der Shell $2istsys.argv

Also:

#!/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],'')

Dann

$ ./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

Antwort2

Viele Möglichkeiten, Python zu parametrisieren. Positionsargumente, Umgebungsvariablen und benannte Argumente. Umgebungsvariablen:

Importieren Sie das Betriebssystem und verwenden Sie getenv wie:

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

Wobei der zweite Parameter der Standardwert für die Umgebungsvariable ist, die nicht festgelegt ist.

Positionsargumente:

Verwenden Sie sys.argc, sys.argv[n], nachdem Sie sys importiert haben.

Benannte Parameter:

Oder für benannte Parameter (was Sie gefragt haben)

 import argparse  

beschreiben Sie dann die möglichen Parameter:

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()

und verwenden Sie sie als Argumente.Breite usw.

Antwort3

Okay, mir ist beim Schreiben der Frage eine Problemumgehung eingefallen, aber ich hatte das Gefühl, dass diese auch für andere Benutzer nützlich sein könnte, also ist sie hier.

Für Python (python2) können wir raw_input()anstelle von verwenden $1, aber es funktioniert etwas anders. Anstatt die Eingabe nach dem Skriptnamen in Bash einzugeben, werden Sie aufgefordert, den Wert einzugebennachSie führen das Skript aus.

Hier ist ein Beispiel:

#!/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: "),'')

Beim Ausführen des Skripts wird der Benutzer aufgefordert, „Zeichen einzugeben:“. Nachdem der Benutzer die Zeichen eingegeben und dann gedrückt hat ENTER, werden die Permutationen im Terminal gedruckt.

Hier ist die Quelle, die auch erklärt, wie dies für Python3 geht.

Antwort4

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()

Auf der Kommandozeile: FileName.py -l abcd

verwandte Informationen