将多个字符串参数传递给 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 脚本的主要内容,如果未能解决你的问题,请参考以下文章
将 Access 表单上命令按钮的参数传递给 python 脚本