将多个字符串参数传递给Python脚本

时间:2020-09-29 21:01:02

标签: python arguments parameter-passing command-line-arguments sys

我有一个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的值”作为第三个参数。

能给我些帮助吗?预先感谢。

1 个答案:

答案 0 :(得分:0)

第一个(也是最可取的)解决方案是将第二个和第三个参数放在引号中,如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', 'of', 'file', '2'])

您可以方便地以

print(args.value_1)
print(args.value_2)
print(args.email)
相关问题