我有以下脚本 -
import os, errno
import argparse
def removecompressed(filename):
try:
os.remove(filename)
print('Removing {}'.format(args.compressedfile))
except OSError as e: # this would be "except OSError, e:" before Python 2.6
print ('File {} does not exist in location {}!'.format(args.compressedfile, args.localpath))
if e.errno != errno.ENOENT: # errno.ENOENT = no such file or directory
raise # re-raise exception if a different error occured
def removeencrypted(filename):
try:
os.remove(filename)
print('Removing {}'.format(args.encryptedfile))
except OSError as e: # this would be "except OSError, e:" before Python 2.6
print ('File {} does not exist in location {}!'.format(args.encryptedfile, args.localpath))
if e.errno != errno.ENOENT: # errno.ENOENT = no such file or directory
raise # re-raise exception if a different error occured
parser = argparse.ArgumentParser()
parser.add_argument('-p', '--localpath', type=str, default='', help="the path containing the files")
parser.add_argument('-c', '--compressedfile', type=str, default='', help="the compressed file to be deleted")
parser.add_argument('-e', '--encryptedfile', type=str, default='', help="the encrypted file to be deleted")
args = parser.parse_args()
removecompressed(args.localpath + args.compressedfile)
removeencrypted(args.localpath + args.encryptedfile)
但我希望-e和-c参数是可选的。我该怎么做呢?
我理解这个回复: Argparse optional positional arguments?
但问题是def首先解析2个字符串以生成文件名。如果我删除其中一个参数,它会抱怨添加字符串和无值。
编辑 - 如果我使用所有3个参数那就没有问题。如果我删除了-e或-c,例如,我删除了-e,我得到以下异常 -
Traceback (most recent call last):
File "cleanup.py", line 35, in <module>
removeencrypted(args.localpath + args.encryptedfile)
TypeError: Can't convert 'NoneType' object to str implicitly
我已将我的论点更新为包含default =&#39;&#39;
答案 0 :(得分:2)
从您的问题中不清楚,如果未提供其中一个参数,应该会发生什么,但原则上,您可能希望提供默认 value:
parser.add_argument('-c', '--compressedfile', type=str, default='', help="the compressed file to be deleted")
如果在命令行中未提供特定命令标志,则使用此值。
请注意,您未使用可选的位置参数,您使用的是可选的常规参数(这是默认行为)。