
У меня естьэтот скрипт на 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».
Обычно я могу использовать $@
или $1
вместо abcd
в последней строке скрипта 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("$1",'')
Но когда я запускаю скрипт, используя что-то вроде этого, ./scriptname.py efgh
я получаю:
$1
1$
вместо перестановок для "efgh".
решение1
Эквивалент позиционного массива параметров оболочки $1
и $2
т. д. в Python: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)
Где второй параметр — это значение по умолчанию для переменной env, которая не задана.
Позиционные аргументы:
Используйте 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 и т.д.
решение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, перестановки будут напечатаны в терминале.
Вот источник, который также объясняет, как это сделать для python3.
решение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