我想通过他们的名字(像kwargs这样的东西)向脚本发送参数。 我试过这样的事情,但它没有做我想做的事情:(假设它是用script.py写的)
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("name")
args = parser.parse_args()
然后用commant行写:script.py name = david
另一件事,假设我在argparse中有几个命名参数如果我不按照它们被声明的顺序发送它们它是否仍能正常工作?
答案 0 :(得分:10)
如上所述的问题包含一些误解,或者我有一个很大的误解。
* keyword和**关键字用于将参数/东西传递给类/函数/方法INSIDE python代码。
argparse用于从外部/命令行将参数/选项传递给python程序。因此,您不会获得1对1的复制。然而,argparse是可配置的,根据你想要的方式,你可以接近。
如果您只想传递一个名字,那么:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("name")
args = parser.parse_args()
print args
会让你:
$ ./pytest.py dave
Namespace(name='dave')
如果你想设置名字,你也可以发送其他东西:
parser.add_argument("-name")
会让你:
./pytest.py -name dave
Namespace(name='dave')
但请注意:
./pytest.py -name dave -name steve
Namespace(name='steve')
但是:
parser.add_argument("--name")
将允许/要求:
./pytest.py --name dave
Namespace(name='dave')
./pytest.py --name=dave
Namespace(name='dave')
如果你:
parser.add_argument("--name", nargs="+")
./pytest.py --name dave steve murphy
Namespace(name=['dave', 'steve', 'murphy'])
但是:
./pytest.py --name=dave --name=steve --name=murphy
Namespace(name= ['murphy'])
(请注意,最后一个是仅包含墨菲的列表。)
所以你能做的是:
parser.add_argument("--name")
parser.add_argument("--email")
parser.add_argument("--hair-color")
./pytest.py --name fred --hair-color murphy --email example@example.com
Namespace(email='example@example.com', hair_color='murphy', name='fred')
答案 1 :(得分:2)
在argparse
以及相同风格的早期命令行处理器中,“选项”或标记的参数与位置之间存在区别。
'optionals'由标志字符串发出信号,例如-f
或--foo
。这些类似于Python函数的关键字参数,但不完全相同。订单无关紧要。在限制中,标志可以连接到值,例如, -f1
,--foo=astring
。
'positionals'按订单标识,没有任何识别名称。这些类似于Python函数的args
。在函数中,所有位置args必须在关键字之前发生。 argparse
'选项'可以与'位置'混合 - 有一些限制。如argparse
用法消息所示,在选项之后提供所有位置是很常见的。
查看argparse
文档中的示例。
我们会定期向想要规避这些约定的人提出问题,例如期望使用不带前缀字符的标记,或输入字对象,foo=test
或foo:test
。其中一些是可能的,但需要更多的工作。而且通常在清晰度和实用性方面收获甚微。
我建议将script.py name = david
传递给只显示sys.argv
列表的脚本。这些是argparse
必须使用的值。我希望你能看到:
['script.py', 'name', '=', 'david']
您的shell已将该命令行拆分为单独的字符串。自己解析该列表可能比将argparse
扭曲成一个表单更容易。
Argparse可以轻松处理
等输入script.py --name david
script.py --name=david
script.py david
答案 2 :(得分:0)
订单并不重要。
将您的参数更改为
parser.add_argument('-name')
另外,你从命令行打电话有什么不对。它应该是这样的:
python script.py name david