
私は持っているこの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','')
ただし、このスクリプトを「abcd」の変数を使用して呼び出して、「abcd」の代わりに「efgh」などの任意の文字の組み合わせを挿入できるようにしたいと考えています。
通常、次のように bash スクリプトの最後の行での代わりに$@
または を使用できます。$1
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",'')
しかし、次のようなスクリプトを実行すると、次のよう./scriptname.py efgh
になります。
$1
1$
「efgh」の順列の代わりに。
答え1
シェルの位置パラメータ配列などに相当するPythonの$1
もの$2
はsys.argv
それで:
#!/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],'')
それから
$ ./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
答え2
Python をパラメータ化する方法はたくさんあります。位置引数、環境変数、名前付き引数。環境変数:
os をインポートし、getenv を次のように使用します。
fw_main_width =os.getenv('FW_MAIN_WIDTH', fw_main_width)
2 番目のパラメータは、env 変数が設定されていない場合のデフォルトです。
位置引数:
sysをインポートした後、sys.argc、sys.argv[n]を使用します。
名前付きパラメータ:
または、名前付きパラメータの場合(質問の内容)
import argparse
次に、可能なパラメータを説明します。
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()
それらを args.width などとして使用します。
答え3
さて、質問を書いている間に回避策を見つけましたが、これは他のユーザーにとっても役立つと感じたので、ここに示します。
python (python2)では、raw_input()
の代わりにを使うことができます$1
が、動作が少し異なります。bashでスクリプト名の後に入力する代わりに、値を入力するように求められます。後スクリプトを実行します。
次に例を示します。
#!/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: "),'')
スクリプトを実行すると、ユーザーに「文字を入力してください:」というプロンプトが表示されます。ユーザーが文字を入力して を押すと、ENTER順列がターミナルに表示されます。
答え4
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()
コマンドライン: FileName.py -l abcd