У меня есть этот сценарий 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", например.
Обычно, я могу использовать a $@
или $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".
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
Много способов параметризовать Python. позиционный args, огибающие переменные и названный args. Огибающие переменные:
импортируйте OS и используйте getenv как:
fw_main_width =os.getenv('FW_MAIN_WIDTH', fw_main_width)
Где второй параметр является значением по умолчанию для огибающей переменной не быть установленным.
Позиционный args:
Используйте sys.argc, sys.argv [n] после импорта sys.
Названные параметры:
Или для именованных параметров, (что Вы спросили),
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 и т.д.
Хорошо, я выяснил обходное решение, в то время как я писал вопрос, но я чувствовал, что это будет полезный для других пользователей, таким образом, здесь это будет.
Для Python (python2), мы можем использовать raw_input()
вместо $1
но это работает немного по-другому. Вместо того, чтобы ввести вход после названия сценария в ударе, Вам предлагают ввести значение после того, как Вы запустите скрипт.
Вот пример:
#!/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, перестановки распечатают в терминале.
Вот источник, который также объясняет, как сделать это для python3.
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