我走到了尽头。我试图将参数传递给Linux来运行某些操作。我想避免用户输入太多的参数。
例如,所需的脚本运行方式如下:
./audit.py -a
我想阻止以下情况:
./audit.py -af
这似乎正在运行为'a'和'f'指定的任何内容。在这种情况下,如果它像'-af'那么我需要它用sys.exit()退出。无论我输入的参数如何,我的len(sys.argv [1:])总是产生1的结果。
import getopts
import sys
def main():
try:
opts, args = getopt.getopt(sys.argv[1:], 'v:adfh')
except getopt.GetoptError as err:
sys.exit(str(err))
if len(sys.argv[1:]) != 1:
sys.exit('Invalid')
for o,a in opts:
if o in ('-v', '--volume'):
print 'Volumes'
elif len(sys.argv[2:]) != 0:
sys.exit('Too many arguments')
elif o in ('-a', '--agent'):
print 'Full audit of agents only'
elif o in ('-d', '--device'):
print 'Full audit of device only'
elif o in ('-f', '--full'):
print 'Full audit of device/agents'
elif o in ('-h', '--help'):
sys.exit('Help Section')
if __name__ == '__main__':
main()
答案 0 :(得分:0)
sys.argv[1:] is ['-af']
的值以及如果检查['-af']的长度是1,这就是if len(sys.argv[1:]) != 1:
始终为假的原因。相反,如果你想检查第一个参数的长度,你需要使用len(sys.argv[1:][0])
或者每个参数长度。
答案 1 :(得分:0)
问题是sys.argv[1:]
会产生切片。换句话说,它是一个列表。在你的情况下,它就像['-af']
。当然,除非您没有传递任何参数,否则长度将始终为1
。也许你打算这样做:
if not all(i < 1 for i in sys.argv[1:]):
sys.exit('Invalid')
答案 2 :(得分:0)
答案 3 :(得分:0)
不是一个完整的答案,但你可能很高兴看到我很高兴找到的图书馆。
docopts - 有一个很棒的视频介绍了如何使用
这是一个很棒的工具,您只需在模块文档部分描述您的参数,例如;
'''
Usage:
myprog -a -v <volumes>...
myprog -f
myprog -h | --help
'''
import docopt
args=docopt.docopt(__doc__)
如果以myprog -a -v one two three
;
{ "--help": false, "-a": true, "-f": false, "-h": false, "-v": true, "": [ "myprog", "one", "two", "three" ] }