整理
这次主要解决的是获取多个参数的问题。下面是我之前获取参数的代码
思路是将选项参数和路径参数分别放到两个列表中
def get_arg(cmd):
arg_ls = []
cmd_arg_ls = cmd.split(' ')[1:]
cmd_arg_ls.append('')
for arg in cmd_arg_ls:
if arg.startswith('-'):
arg_ls.append(arg)
cmd_arg_ls.remove(arg)
return arg_ls, cmd_arg_ls[0]
描述问题:选项参数为一个时,运行没有问题。当选项参数增加到两个时,运行结果就出现了问题,选项参数少了一个。
解决过程:将上述代码取出,做了一个简单的实验
list1 =['a','b','-a','-b']
arg=[]
for i in list1:
if i.startswith('-'):
arg.apprnd(i)
list1.remove(i)
print(list1)
print(arg)
输出为
['a', 'b', '-b']
['-a']
发现字符串'-b'没有取出来。为了弄清楚原因,我将四个字符串改成都以'-'开头
list1 =['-a','-b','-c','-d']
arg=[]
for i in list1:
if i.startswith('-'):
arg.append(i)
list1.remove(i)
print(arg)
运行结果
['-a', '-c']
可以看到是隔一个取值的。通过打印遍历的i的取值,发现只取了字符串'-a', '-c'。猜想遍历列表是通过遍历列表的下标实现的
验证代码
list1 =['-a','-b','-c','-d']
arg=[]
for i, j in enumerate(list1):
print('index:', i)
print('vlaue:', j)
if j.startswith('-'):
arg.append(j)
list1.remove(j)
实验结果
index: 0
vlaue: -a
index: 1
vlaue: -c
所以解决方法就是在列表移除一个元素时在补充回来。相关代码如下:
def get_arg(cmd:str) -> str:
...
for arg in cmd_arg_ls:
if arg.startswith('-'):
...
cmd_arg_ls.insert(0,"")
return arg_ls, cmd_arg_ls[-2]
改完之后,发现不带参数不能执行。经过分析发现是列表 'cmd_arg_ls' 索引返回的值出现了问题,原先列表‘cmd_arg_ls’中本身有一个空字符串,代表路径参数为空的情况。现在改变了索引后,如果不给其参数,列表中只会有一个元素。我的解决思路是把有参数和没有参数的分开,把重心放在有参数时的代码部分。
接下来是要解决如何识别多个参数的问题了。原先的方法是把用户输入参数以及参数的排列顺序都列出来,而这种方法的缺点是一旦参数过多,就会有很多种排列可能。之后有想到对输入的参数进行排序处理,这样就解决了需要排列组合的问题
main
import os
from cd import cd, path
from ls import *
while True:
cmd = input("$ ")
if 'cd' in cmd:
cmd_c0 = cmd.strip('cd ')
path = cd(cmd_c0)
elif cmd == "ls":
ls()
continue
if cmd.startswith('ls'):
args, cmd_path = get_arg(cmd)
arg_len = len(args)
if cmd_path == '':
ls_path = path
else:
ls_path = cmd_path
if arg_len == 1:
if '-d' in args:
d_(ls_path)
elif '-l' in args:
l_(ls_path)
elif '-a' in args:
a_(ls_path)
elif '-1' in args:
obo(ls_path)
elif '-r' in args:
r_(ls_path)
elif arg_len > 1:
if args == ['--author', '-l']:
author(ls_path)
if args == ['-S', '-l']:
S_(ls_path)
if args == ['-a', '-l']:
la_(ls_path)
if args == ["-X", "-l"]:
X_(ls_path)
if args == ['-l', '-t']:
lt_(ls_path)
else:
ls(ls_path)
ls
import os
from cd import path
def ls(path = ""):
return os.system(f"dir /w {path}")
def get_arg(cmd:str) -> str:
arg_ls = []
cmd_arg_ls = cmd.split(' ')[1:]
# cmd_arg_ls.append('')
for arg in cmd_arg_ls:
if arg.startswith('-'):
arg_ls.append(arg)
cmd_arg_ls.remove(arg)
cmd_arg_ls.insert(0,"")
# print(2, cmd_arg_ls)
arg_ls = sorted(arg_ls)
return arg_ls, cmd_arg_ls[-1]
def d_(path:str):
dir_path = os.path.dirname(path)
dir_name = dir_path.split('\\')[-1]
# print(dir_path)
print(dir_name)
# return dir_name
def l_(path):
return os.system(f'powershell dir {path}')
def a_(path):
return os.system(f'dir /a/w {path}')
def r_(path):
return os.system(f'dir /w /o:-n {path}')
def author(path):
return os.system(f'dir /q {path}')
def S_(path):
return os.system(f'dir /o:s {path}')
def X_(path):
return os.system(f'dir /o:e {path}')
def lt_(path):
return os.system(f'dir /t:w /o:-d')
def la_(path):
return os.system(f'dir /a {path}')
def obo(path):
return os.system(f'dir /b/o')
用以致学