将 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”。

通常,我可以在 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

shell 的位置参数数组等的 Python 等效$1$2sys.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。位置参数、环境变量和命名参数。环境变量:

导入操作系统并使用 getenv 如下:

fw_main_width  =os.getenv('FW_MAIN_WIDTH',  fw_main_width)  

其中第二个参数是未设置的环境变量的默认值。

位置参数:

导入 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,排列就会打印在终端上。

这里有源代码,它还解释了如何针对 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

相关内容