诗歌文档说,脚本部分可用于在安装包时安装脚本或可执行文件。但它没有显示任何如何将参数传递给脚本的示例。
如何接收argparse函数中的参数?
我正在编写一个脚本,它有两个互斥的参数,以及一个只对其中一个参数有意义的选项.我试图将argparse设置为失败,如果你用没有意义的参数调用它.
要明确:
-m -f 说得通
-s 说得通
-s -f 应该抛出错误
没有争论是好的.
我的代码是:
parser = argparse.ArgumentParser(description='Lookup servers by ip address from host file')
parser.add_argument('host', nargs=1,
help="ip address to lookup")
main_group = parser.add_mutually_exclusive_group()
mysql_group = main_group.add_argument_group()
main_group.add_argument("-s", "--ssh", dest='ssh', action='store_true',
default=False,
help='Connect to this machine via ssh, instead of printing hostname')
mysql_group.add_argument("-m", "--mysql", dest='mysql', action='store_true',
default=False,
help='Start a mysql tunnel to the host, instead of printing hostname')
mysql_group.add_argument("-f", "--firefox", dest='firefox', action='store_true',
default=False,
help='Start a firefox session to the remotemyadmin instance')
Run Code Online (Sandbox Code Playgroud)
哪个不起作用,因为它吐出来
usage: …Run Code Online (Sandbox Code Playgroud) 我正在编写一个相对简单的Python脚本,它支持几个不同的命令.不同的命令支持不同的选项,我希望能够将argparse解析的选项传递给指定命令的正确方法.
用法字符串如下所示:
usage: script.py [-h]
{a, b, c}
...
script.py: error: too few arguments
Run Code Online (Sandbox Code Playgroud)
我可以轻松调用适当的方法:
def a():
...
def b():
...
def c():
...
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.set_defaults(method = a)
...
arguments = parser.parse_args()
arguments.method()
Run Code Online (Sandbox Code Playgroud)
但是,我必须将参数传递给这些方法,并且它们都接受不同的参数集.
目前,我只是传递Namespaceargparse返回的对象,如下所示:
def a(arguments):
arg1 = getattr(arguments, 'arg1', None)
...
Run Code Online (Sandbox Code Playgroud)
这似乎有点尴尬,并且使方法更难以重用,因为我必须将参数作为dict或命名空间而不是通常的参数传递.
我想在某种程度上使用参数定义方法(就像普通函数一样),并且仍然能够在传递适当的参数时动态调用它们.像这样:
def a(arg1, arg2):
...
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.set_defaults(method = a)
...
arguments = parser.parse_args()
arguments.method() # <<<< Arguments passed here somehow …Run Code Online (Sandbox Code Playgroud) 我试图从Linux SSH安全Shell命令行环境运行python脚本,我试图导入argparse库,但它给出错误:"ImportError:没有名为argparse的模块".
我认为这是因为Linux shell使用的Python环境中没有argparse库,我想我可以修复它,如果我能找到Python环境所使用的库的目录,并且将argparse库复制到其中,但我找不到该目录所在的位置.
我很感激找到这个目录的任何帮助(我想我现在可以将argparse库包含在与我的python脚本相同的目录中,但我宁愿在其他Python库所在的地方使用argparse库,因为它应该).
如果我有一个在多个参数之间共享的有效选项字符串列表,则该列表将写入帮助字符串中的多个位置.让它更难阅读:
def main():
elements = ['a', 'b', 'c', 'd', 'e', 'f']
parser = argparse.ArgumentParser()
parser.add_argument(
'-i',
nargs='*',
choices=elements,
default=elements,
help='Space separated list of case sensitive element names.')
parser.add_argument(
'-e',
nargs='*',
choices=elements,
default=[],
help='Space separated list of case sensitive element names to '
'exclude from processing')
parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
使用命令行参数运行上述函数时,--help它显示:
usage: arguments.py [-h] [-i [{a,b,c,d,e,f} [{a,b,c,d,e,f} ...]]]
[-e [{a,b,c,d,e,f} [{a,b,c,d,e,f} ...]]]
optional arguments:
-h, --help show this help message and exit
-i [{a,b,c,d,e,f} [{a,b,c,d,e,f} ...]]
Space separated list of case …Run Code Online (Sandbox Code Playgroud) 我想知道是否有可能在一个带有可选参数的参数后面有一个位置参数.理想情况下,输入命令行的最后一个参数将始终应用于'testname'.
import argparse
parser = argparse.ArgumentParser(description='TAF')
parser.add_argument('-r','--release',nargs='?',dest='release',default='trunk')
parser.add_argument('testname',nargs='+')
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
我希望这两个调用都能将smoketest应用于testname,但第二个调用会导致错误.
>> python TAF.py -r 1.0 smoketest
>> python TAF.py -r smoketest
TAF.py: error: too few arguments
Run Code Online (Sandbox Code Playgroud)
我意识到将位置参数移动到前面将导致可选参数的正确行为,但这不是我正在寻找的格式.选择标志看起来像一个有吸引力的替代方案,但它会抛出错误而不是忽略不匹配的项目.
编辑:我发现了一个hacky方式.如果有人有更好的解决方案我会很感激.
import argparse
parser = argparse.ArgumentParser(description='TAF')
parser.add_argument('-r','--release',nargs='?',dest='release',default='trunk')
parser.add_argument('testname',nargs=argparse.REMAINDER)
args = parser.parse_args()
if not args.testname:
args.testname = args.release
args.release = ''
Run Code Online (Sandbox Code Playgroud) 我刚开始使用argparse模块.我编写了以下简化代码片段来演示我遇到的问题.
from argparse import ArgumentParser
if __name__ == '__main__':
parser = ArgumentParser('Test argparse. This string needs to be relatively long to trigger the issue.')
parser.add_argument('-f', '--fin', help='a', required = True)
parser.add_argument('-o', '--out ', help='b', required = True)
parser.add_argument('-t', '--trans', help='c', required = True)
args = parser.parse_args()
print(repr(vars(args)))
Run Code Online (Sandbox Code Playgroud)
AssertionError将使用参数-h运行脚本时生成
Traceback (most recent call last):
File "arg.py", line 10, in <module>
args = parser.parse_args()
File "C:\Users\user\AppData\Local\Continuum\Anaconda\envs\py3k\lib\argparse.py", line 1707, in parse_args
args, argv = self.parse_known_args(args, namespace)
File "C:\Users\user\AppData\Local\Continuum\Anaconda\envs\py3k\lib\argparse.py", line 1739, …Run Code Online (Sandbox Code Playgroud) 我想在脚本中定义不同的子分析器,同时继承来自公共父级的选项,但具有不同的默认值.但它没有按预期工作.
这是我做的:
import argparse
# this is the top level parser
parser = argparse.ArgumentParser(description='bla bla')
# this serves as a parent parser
base_parser = argparse.ArgumentParser(add_help=False)
base_parser.add_argument('-n', help='number', type=int)
# subparsers
subparsers = parser.add_subparsers()
subparser1= subparsers.add_parser('a', help='subparser 1',
parents=[base_parser])
subparser1.set_defaults(n=50)
subparser2 = subparsers.add_parser('b', help='subparser 2',
parents=[base_parser])
subparser2.set_defaults(n=20)
args = parser.parse_args()
print args
Run Code Online (Sandbox Code Playgroud)
当我从命令行运行脚本时,这就是我得到的:
$ python subparse.py b
Namespace(n=20)
$ python subparse.py a
Namespace(n=20)
Run Code Online (Sandbox Code Playgroud)
显然,第二个会set_defaults覆盖父母中的第一个.由于argparse文档中没有任何关于它的内容(非常详细),我认为这可能是一个错误.
有一些简单的解决方案吗?之后我可以检查args变量并将None值替换为每个subparser的预期默认值,但这正是我期望argparse为我做的.
顺便说一下,这是Python 2.7.
我在argparse文档中阅读了以下内容:
'
store_const' - 存储const关键字参数指定的值.(请注意,const关键字参数默认为相当无用的None.)'store_const'操作最常用于指定某种标志的可选参数.例如:Run Code Online (Sandbox Code Playgroud)>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='store_const', const=42) >>> parser.parse_args('--foo'.split()) Namespace(foo=42)`
这与使用default选项设置参数的默认值有何不同?
argparse用下划线替换可选参数中的破折号以确定其目的地:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--use-unicorns', action='store_true')
args = parser.parse_args(['--use-unicorns'])
print(args) # returns: Namespace(use_unicorns=True)
Run Code Online (Sandbox Code Playgroud)
然而,用户必须记住该选项是--use-unicorns或--use_unicorns;使用错误的变体会引发错误。
这可能会导致一些挫败感,因为变量args.use_unicorns没有明确定义了哪个变体。
我怎样才能argparse接受--use-unicorns和--use_unicorns作为定义这个可选参数的有效方法?