我正在使用argparse编写一个递归程序.唯一需要的参数是要处理的文件(或多个文件).当我递归调用它时,我不需要文件名(因为我将调用一个新目录),但我需要选项.问题是argparse允许python programname.py -options arg FILENAME FILENAME和python programname.py FILENAME FILENAME -options arg.我可以苦心寻找一个' - '并用大量的if语句来解决它,但我觉得应该有一个更好的方法.
不确定它是否重要,但这是我的argparse声明:
parser = argparse.ArgumentParser(description='Personal upload script. (defaults to ' + user + '@' + server + directory + ')')
parser.add_argument('files', nargs="+", help='file(s) to upload')
parser.add_argument('-s', metavar='example.com', default=server, help='server to upload to')
parser.add_argument('-u', metavar='username', default=user, help='ftp username')
parser.add_argument('-p', metavar='password', default=password, help='ftp password')
parser.add_argument('-d', metavar='example/', default=directory, help='directory to place file in')
parser.add_argument('-n', metavar='myfile.txt', help='name to save file as')
parser.add_argument('-c', metavar='###', help='chmod upload')
parser.add_argument('-l', action='store_true', help='print …Run Code Online (Sandbox Code Playgroud) 刚刚开始学习python并将命令行选项传递给python脚本.我正在尝试连接两个或多个参数并将其传递给字符串变量,
例如,
myscript.py http://www.domain.com 1234
Run Code Online (Sandbox Code Playgroud)
将它放入一个名为的字符串变量中url,该变量的值应为" http://www.domain.com:1234 "
我不太确定如何存档.使用raw_input和一些字符串操作是非常直接的,但我想知道是否也可以这样做argparse.
我有一个python命令行脚本,可以以两种不同的方式使用.
第一种情况是这样的:
script.py -max MAX -min MIN -delta DELTA
Run Code Online (Sandbox Code Playgroud)
where -max和-min是必需的参数,-delta是可选的.
第二种情况是:
script.py some_file.txt -f
Run Code Online (Sandbox Code Playgroud)
其中some_file.txt是必需的位置参数,-f是可选的.
我如何使用任何Python命令行参数解析器(argparse,optparse,getopt等)实现它?
更新:脚本只做一件事 - 刮擦网站.但它的运作时间很长.在第一种情况下,我们运行新的scrape会话,而在第二次加载之前保存的会话并继续报废.
当我给Python的argparse输入它不喜欢时,它会引发一个代码为2的SystemExit,这似乎意味着"没有这样的文件或目录".为什么要使用此错误代码?
import argparse
import errno
parser = argparse.ArgumentParser()
parser.add_argument('arg')
try:
parser.parse_args([])
except SystemExit as se:
print("Got error code {} which is {} in errno"
.format(se.code, errno.errorcode[se.code]))
Run Code Online (Sandbox Code Playgroud)
产生这个输出:
usage: se.py [-h] arg
se.py: error: too few arguments
Got error code 2 which is ENOENT in errno
Run Code Online (Sandbox Code Playgroud) 我有一个脚本,它接受一些参数,使用其中一些参数来选择要运行的脚本,并将其余参数传递给该脚本.所以它看起来像这样:
parser = ArgumentParser()
parser.add_argument('script', choices['a', 'b'])
parser.add_argument('rest_args', nargs='*')
args = parser.parse_args()
if args.script == 'a':
subprocess.call('python a.py %s' % ' '.join(args.rest_args))
else:
subprocess.call('python b.py %s' % ' '.join(args.rest_args))
Run Code Online (Sandbox Code Playgroud)
这工作正常,除非我想传入以...开头的参数-.例如,如果我打电话python my_script.py a --foo,我会得到一个错误unrecognized arguments,当我真的想让它运行时python a.py --foo(即只是传递--foo给子进程).
有没有办法解决这个问题argparse?
简化的测试用例:我有一个带有两个参数的脚本.第一个是整数列表.第二个是一个整数,必须包含在第一个参数的整数集中.
例如:
$ python argtest.py --valid_nums 1 2 3 --num 2
Run Code Online (Sandbox Code Playgroud)
应该工作,但是:
$ python argtest.py --valid_nums 1 2 3 --num 4
Run Code Online (Sandbox Code Playgroud)
不应该工作,因为num不是in valid_nums.但是,我遇到了一些困难(阅读:我怀疑它比它的价值更麻烦,但我真的希望它能够工作)实现这个功能.
实施尝试:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--valid_nums',
type=int,
nargs='+')
args = parser.parse_args()
print "Numbers: ", args.valid_nums
parser.add_argument('--num',
type=int,
choices=args.valid_nums)
args = parser.parse_args()
print args
Run Code Online (Sandbox Code Playgroud)
实际产量:
$ python argtesttest.py --valid_nums 1 2 3 --num 2
usage: argtesttest.py [-h] [--valid_nums VALID_NUMS [VALID_NUMS ...]]
argtesttest.py: error: unrecognized arguments: --num 2
Run Code Online (Sandbox Code Playgroud)
期望的输出:
$ python argtesttest.py --valid_nums 1 …Run Code Online (Sandbox Code Playgroud) 我有以下python:
import argparse
parser = argparse.ArgumentParser()
requiredNamed = parser.add_argument_group('required named arguments')
requiredNamed.add_argument('-h', '--host_name', required=True, help="Host IP address")
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
这会产生以下错误:
argparse.ArgumentError: argument -h/--help: conflicting option string(s): -h
Run Code Online (Sandbox Code Playgroud)
每一个字母的作品除了罚款-h.它似乎是为--help保留的.我怎样才能使它不-h被自动保留?
在开发过程中,我正处于过渡阶段,即将变成一个相当庞大的Python 2.7项目。现在,我将所有unittest班级集中在各自的模块中tests.py,该模块大约有3300行。这太疯狂了,无法导航,到处都是坏习惯,等等。
因此,我当前的任务是将其重构为子模块。作为此重构的一部分,我想简化从命令行运行一部分测试的过程。例如:
$ python tests.py --all <--- runs *all* tests
$ python tests.py --utils_base <--- runs all tests on .utils
$ python tests.py --utils_vector <--- runs all tests on .utils.vector
$ python tests.py --utils_base --utils_vector <--- runs all tests on .utils.vector & .utils
Run Code Online (Sandbox Code Playgroud)
因此,我开始使用进行设置argparse。我进行了基本ArgumentParser设置,没有问题,并且帮助消息显示正常:
$ python tests.py -h
usage: tests.py [-h] [--all] [--utils_base]
optional arguments:
-h, --help show this help message and exit
Global Options:
--all Run all tests (overrides any …Run Code Online (Sandbox Code Playgroud) 使用argparse,我创建了一个小脚本,其中包含我的分析程序的命令行解析器,它是自制python包的一部分.它工作得很好,但我真的不喜欢如何控制它.
这是代码在脚本本身中的样子
def myAnalysis():
parser = argparse.ArgumentParser(description='''
lala''')
parser.add_argument('-d', '--data',help='')
parser.add_argument('-e', '--option_1', help='', default=False, required=False)
parser.add_argument('-f', '--option_2', help='', default=False, required=False)
# combine parsed arguments
args = parser.parse_args()code here
Run Code Online (Sandbox Code Playgroud)
除此之外,分析包的安装文件中还有更多内容
entry_points={
'console_scripts': [
'py_analysis = edit.__main__:myAnalysis'
]
Run Code Online (Sandbox Code Playgroud)
正如我所说,这没有任何问题.分析我必须使用的一些数据
py_analysis --data path_to_data_file
Run Code Online (Sandbox Code Playgroud)
有时候,我需要一些选择.为此,它可能看起来很糟糕
py_analysis --data path_to_data_file --option_1 True --option_2 True
Run Code Online (Sandbox Code Playgroud)
就我个人而言,这有点难看.我更喜欢类似的东西
py_analysis path_to_data_file --option_1 --option_2
Run Code Online (Sandbox Code Playgroud)
我很确定这是可能的.我只是不知道如何
您好,我从开始argparse。我的目标是使用接受参数并重定向到相应命令功能的主要命令构建CLI。这是我到目前为止所做的:
def main():
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
command1_parser = subparsers.add_parser('command1')
command1_parser.set_defaults(func=command1)
command1_parser.add_argument('--name', dest='name')
command2_parser = subparsers.add_parser('command2')
command2_parser.set_defaults(func=command2)
command2_parser.add_argument('--frequency', dest='frequency')
args = parser.parse_args()
def command1():
# do something with args.name
def command2():
# do something with args.frequency
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
当我做:
entrypoint command1 --name Hello
Run Code Online (Sandbox Code Playgroud)
要么:
entrypoint command2 --frequency 10
Run Code Online (Sandbox Code Playgroud)
无法捕获相应的args。我做错了什么?谢谢!