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

Posted

技术标签:

【中文标题】将多个字符串参数传递给 Python 脚本【英文标题】:Passing Multiple String Arguments to Python Script 【发布时间】:2021-01-15 12:52:12 【问题描述】:

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

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

【问题讨论】:

为什么不在命令行本身用引号将它们括起来? 谢谢,但由于我是从另一个程序运行程序(R 使用 sytem 命令),所以引号不起作用 【参考方案1】:

第一个(可能也是最可取的)解决方案是按照 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)

【讨论】:

谢谢维克多。你能详细说明一下nargs吗? 好的,对argparse相关的答案解释得比较全面。【参考方案2】:

您可以使用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" 

Namespace(email=['ichraf@gmail.com', 'user@gmail.com'], stv1='value of file 1', stv2='value of file 2')

【讨论】:

以上是关于将多个字符串参数传递给 Python 脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个字符串参数传递给 PowerShell 脚本?

将 Access 表单上命令按钮的参数传递给 python 脚本

Jenkins作业无法在构建期间将整数参数传递给python脚本

在python 3中将参数传递给exec

将命令行参数传递给python脚本[重复]

从 Web 应用程序将参数传递给 Python 脚本?