
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“ $1
anstelle 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 efgh
erhalte ich:
$1
1$
anstelle der Permutationen für „efgh“.
Antwort1
Das Python-Äquivalent des Positionsparameter-Arrays $1
usw. der Shell $2
istsys.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