Передать переменную bash в скрипт python

Передать переменную bash в скрипт 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».

Обычно я могу использовать $@или $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

Связанный контент