Передайте переменную удара сценарию Python

У меня есть этот сценарий 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".

13
задан 11 October 2019 в 21:12

4 ответа

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
22
ответ дан 23 November 2019 в 03:12

Много способов параметризовать 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 и т.д.

7
ответ дан 23 November 2019 в 03:12

Хорошо, я выяснил обходное решение, в то время как я писал вопрос, но я чувствовал, что это будет полезный для других пользователей, таким образом, здесь это будет.

Для 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.

2
ответ дан 23 November 2019 в 03:12
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

1
ответ дан 23 November 2019 в 03:12

Другие вопросы по тегам:

Похожие вопросы: