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

5

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

我能得到一些帮助。提前谢谢。


2
为什么不在命令行本身中用引号括起来呢? - Susmit Agrawal
谢谢,但由于我正在另一个程序(使用系统命令的R)中运行该程序,引号无法正常工作。 - Stan
2个回答

4

第一种(也可能是最可取的)解决方案是像Susmit Agrawal建议的那样,将第二个和第三个参数用引号括起来。这样,shell本身会适当地将命令行分成参数。

python mytest.py xx@yz.com  "value of file 1"  "value of file 2"

如果你确实需要在不使用引号的情况下传递参数,那么你必须接受 shell 将在空格处拆分第二个和第三个参数的事实,因此你需要自己从 sys.argv 重构它们。

最后,你可能想要探索 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)

谢谢Victor。你能详细解释一下nargs吗? - Stan
当然,会更详细地解释与argparse相关的答案。 - Victor

0

你可以使用 argparse 来传递参数:

import argparse 

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-stv1', type=str)
    parser.add_argument('-stv2', type=str)
    parser.add_argument('-email', nargs='+')
    args = parser.parse_args()
    print(args)

nargs='+' 表示至少需要传递一个或多个电子邮件作为参数。

执行脚本将会得到以下结果:

python3 script.py -email ichraf@gmail.com user@gmail.com -stv1 "value of file 1" -stv2 "value of file 2" 

命名空间(email=['ichraf@gmail.com', 'user@gmail.com'], stv1='文件1的值', stv2='文件2的值')


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接