Python 列表的多个用户参数

Python multiple user arguments to a list

我无法用语言来感谢你们所有人提供的如此重要的建议。现在一切都开始变得有意义了。我为我错误的变量命名道歉。这只是因为我想快速学习,当我用自己的增强功能编写最终脚本时,我不会进行此类练习,将在此处 posted。

我想更进一步,将我们隔离的值(ip、端口和名称)传递给模板。我试过了,但即使我感觉很接近,也做不好。我要构建的文本如下所示。 (

          Host Address:<IP>:PORT:<1>
          mode tcp
          bind <IP>:<PORT> name <NAME>

我已经在 rahul 提供的工作脚本中尝试了这个。(我已经按照 stackexchange 的规定编辑了我的原始代码。请也帮忙解决一次。非常感谢。

#!/usr/bin/python
import argparse
import re
import string

p = argparse.ArgumentParser()
p.add_argument("input", help="input the data in format ip:port:name", nargs='*')  
args = p.parse_args()
kkk_list = args.input 

def func_three(help):
    for i in help:
        print(i)

for kkk in kkk_list:
    bb = re.split(":|,", kkk) 
    XXX=func_three(bb)
for n in XXX:
    ip, port, name = n
    template ="""HOST Address:{0}:PORT:{1}
              mode tcp
              bind {0}:{1} name {2}"""
       sh = template.format(ip,port,name)
       print sh
原始 post:--

这里是初学者。我写了下面的代码,但它并没有带我到任何地方。

#!/usr/bin/python
import argparse
import re
import string

p = argparse.ArgumentParser()
p.add_argument("INPUT")  
args = p.parse_args()
KKK= args.INPUT
bb=re.split(":|,", KKK)

def func_three(help):
    for i in help:
        #print help
        return help

#func_three(bb[0:3])
YY = var1, var2, var3 = func_three(bb[0:3])
print YY

运行这个脚本的方法应该是"script.py :"。即:script.py 192.168.1.10:80:string 172.25.16.2:100:string

如您所见,是否通过了一个论点我没有问题。但是当有更多参数时,我无法确定如何锻炼正则表达式并通过循环完成此操作。

所以回顾一下,这就是我希望输出看起来像进一步进行的方式。

192.168.1.10
80
name1

172.25.16.2
100
name2

如果有其他更好的方法可以实现,欢迎提出。

我会说你正在做的事情可以更简单地完成。如果您想在出现冒号时拆分输入,您可以使用:

#!/usr/bin/python
import sys

# sys.argv is the list of arguments you pass when you run the program
# but sys.argv[0] is the actual program name
# so you want to start at sys.argv[1]
for arg in sys.argv[1:]:
    listVar = arg.split(':')
    for i in listVar:
        print i
    # Optionally print a new line
    print

抛开错误的变量名不谈,如果你想使用 argparse(我认为这是一个好习惯,即使它最初有点复杂)你应该使用 nargs='+' 选项:

#!/usr/bin/env python

import argparse
import re
import string

p = argparse.ArgumentParser()
p.add_argument("INPUT", nargs='+')  
args = p.parse_args()
KKK= args.INPUT

def func_three(help):
    for i in help:
        #print help
        return help

for kkk in KKK:
    bb=re.split(":|,", kkk)
    #func_three(bb[0:3])
    YY = var1, var2, var3 = func_three(bb[0:3])
    print YY

如果您查看 the documentation for argparse,您会注意到有一个 nargs 参数可以传递给 add_argument,它允许您对多个输入进行分组。

例如:

p.add_argument('INPUT', nargs='+')

会做到至少有一个参数,但所有参数都将收集到一个列表中。

然后您可以像这样检查每个输入:

args = p.parse_args()
for address in args.INPUT:
    ip, port = address.split(':')

请根据上下文命名您的变量。您将需要使用 nargs=* 来接受多个参数。我在下面添加了更新的代码,可以按您的需要打印。

#!/usr/bin/python
import argparse
import re
import string

p = argparse.ArgumentParser()
p.add_argument("input", help="input the data in format ip:port:name", nargs='*')  
args = p.parse_args()
kkk_list = args.input # ['192.168.1.10:80:name1', '172.25.16.2:100:name3']

def func_three(help):
    for i in help:
        print(i)

for kkk in kkk_list:
    bb = re.split(":|,", kkk) 
    func_three(bb)
    print('\n')

# This prints
# 192.168.1.10
# 80
# name1


# 172.25.16.2
# 100
# name3

针对新要求

更新了代码
#!/usr/bin/python
import argparse
import re
import string

p = argparse.ArgumentParser()
p.add_argument("input", help="input the data in format ip:port:name", nargs='*')  
args = p.parse_args()
kkk_list = args.input # ['192.168.1.10:80:name1', '172.25.16.2:100:name3']


def printInFormat(ip, port, name):
    formattedText = '''HOST Address:{ip}:PORT:{port} 
                        mode tcp 
                        bind {ip}:{port} name {name}'''.format(ip=ip, 
                                                                port=port, 
                                                                name=name)
    textWithoutExtraWhitespaces =  '\n'.join([line.strip() for line in formattedText.splitlines()])
    # you can break above thing
    # text = ""
    # for line in formattedText.splitlines():
    #       text += line.strip()
    #       text += "\n" 

    print(formattedText)


for kkk in kkk_list:
    ip, port, name = re.split(":|,", kkk)

    printInFormat(ip, port, name)


# HOST Address:192.168.1.10:PORT:80
# mode tcp
# bind 192.168.1.10:80 name name1
# HOST Address:172.25.16.2:PORT:100
# mode tcp
# bind 172.25.16.2:100 name name3