问题描述
我有一个python脚本,需要在其中传递多个参数。第一个参数可能有多封电子邮件,第二个参数是一个字符串,第三个参数也是一个字符串。
mytest.py:
def tfunc(em,st1,st2):
#### do blah blah blah
def main ():
eml = sys,argv[1].strip()
st1v = sys,argv[2].strip()
st2v = sys,argv[3].strip()
dosom = tfunc(eml,st1v,st2v)
if __name__ == '__main__':
main()
现在我正在测试在命令行上运行该功能的方式是:
python mytest.py xx@yz.com value of file 1 value of file 2
所以参数实际上是xx@yz.com(也需要知道如果我有多封电子邮件会发生什么),“文件1的值”和“文件2的值”
在我实际的最终代码中,两个参数都将留有空格。但是,当我运行代码时,它将正确接收电子邮件(如果只有一个),但是将第二个参数作为值(来自第一个参数)和of作为(来自第一个参数)。但这不是我想要的。
我正在寻找xx@yz.com作为第一个参数,“文件1的值”作为第二个参数,而“文件2的值”作为第三个参数。
能给我些帮助吗?预先感谢。
解决方法
第一个(也是最可取的)解决方案是将第二个和第三个参数放在引号中,如Susmit Agrawal建议的那样。然后,shell本身会将命令行适当地拆分为参数。
python mytest.py xx@yz.com "value of file 1" "value of file 2"
如果确实需要传递不带引号的参数,则必须接受shell将在空格处拆分第二个和第三个参数,因此您需要自己从sys.argv
重构它们。 / p>
最后,您可能想探索argparse库来帮助您解析命令行参数。在这种情况下,您可能希望使用可选参数,并将nargs
设置为'+'
或基于命令行API的某个特定数字。例如,如果您通过以下方式定义和解析参数,
parser = argparse.ArgumentParser()
parser.add_argument('--value-1',nargs=4)
parser.add_argument('--value-2',nargs=4)
parser.add_argument('email',nargs='+')
args = parser.parse_args()
print(args)
然后您可以使用以下方式调用您的Python程序
python mytest.py xx@yz.com --value-1 value of file 1 --value-2 value of file 2
并获得以下结果,
Namespace(email=['xx@yz.com'],value_1=['value','of','file','1'],value_2=['value','2'])
您可以方便地以
print(args.value_1)
print(args.value_2)
print(args.email)