파일과 디렉토리를 사용하는 매우 간단한 터미널 메뉴를 만들고 싶으므로 다음을 시도했습니다.
if __name__ == '__main__':
p = argparse.ArgumentParser(NAME)
p.add_argument('-data:', '--input_data', default=sys.stdin)
p.add_argument('-labels:', '--targets', default=sys.stdin)
p.add_argument('-input_directory:', '--input', default=sys.stdin)
p.add_argument('-output_data:', '--output', default=sys.stdout)
opts = p.parse_args()
if not any([opts.input, opts.output, opts.targets,opts.input_data]):
p.print_usage()
quit()
print '\npress -h to see the help\n'
elif any([opts.targets,opts.input_data]):
print '\ncompleted action\n'
p.print_usage()
#Recibe (datos, etiquetas)
perform_stuff(opts.input_data, opts.targets)
quit()
#Here is the problem:
elif any([opts.input, opts.output]):
print '\ncompleted action\n'
retrive(opts.input)
write(opts.output)
단순화를 위해 perform_stuff(path/in/file, path/out/file)
, retrive(opts.input)
및 write(opts.output)
구현을 생략했습니다 . 문제는 작동하는 유일한 명령은 다음과 같다는 것입니다.
if not any([opts.input, opts.output, opts.targets,opts.input_data]):
p.print_usage()
quit()
print '\npress -h to see the help\n'
elif any([opts.targets,opts.input_data]):
print '\ncompleted action\n'
p.print_usage()
#Recibe (datos, etiquetas)
perform_stuff(opts.input_data, opts.targets)
quit()
반면에 실행하려고 할 때 :
#Here is the problem:
elif any([opts.input, opts.output]):
print '\ncompleted action\n'
retrive(opts.input)
write(opts.output)
내 간단한 프로그램은 그냥 멈 춥니 다. 나는 argparse를 처음 사용했으며 문제가 if / else 문을 올바르게 사용하는 것과 관련이 있다고 생각합니다. 따라서 간단한 프로그램의 메뉴는 어떻게 만들어야합니까?
여기서는 if / else 트리가 작동하도록하는 데 중점을두고 코드를 정리하고 압축했습니다.
파서에서 나는 short options
단일 문자로 다시 썼습니다 . 또한 기본값을 None
. 그러면 if
테스트가 더 쉬워집니다. (경우에 어떻게해야 opts.input
입니다 stdin
및 테스트 if not opts.input:
?).
import argparse
def quit():
import sys
sys.exit(1)
def perform_stuff(*args):
print 'stuff', args
def retrive(*args):
print 'retrieve', args
if __name__ == '__main__':
p = argparse.ArgumentParser()
# single letter `-d` string; use default None
p.add_argument('-d', '--input_data')
p.add_argument('-t', '--targets')
p.add_argument('-i', '--input')
p.add_argument('-o', '--output')
opts = p.parse_args()
print 'opts', opts
if not any([opts.input, opts.output, opts.targets, opts.input_data]):
p.print_usage()
print 'press -h to see the help'
quit()
elif any([opts.targets,opts.input_data]):
perform_stuff(opts.input_data, opts.targets)
quit()
elif any([opts.input, opts.output]):
retrive(opts.input, opts.output)
else:
print 'else'
샘플 실행 :
1814:~/mypy$ python stack36877714.py
opts Namespace(input=None, input_data=None, output=None, targets=None)
usage: stack36877714.py [-h] [-d INPUT_DATA] [-t TARGETS] [-i INPUT]
[-o OUTPUT]
press -h to see the help
1815:~/mypy$ python stack36877714.py -d input_data
opts Namespace(input=None, input_data='input_data', output=None, targets=None)
stuff ('input_data', None)
1815:~/mypy$ python stack36877714.py -t targets
opts Namespace(input=None, input_data=None, output=None, targets='targets')
stuff (None, 'targets')
1815:~/mypy$ python stack36877714.py -i input
opts Namespace(input='input', input_data=None, output=None, targets=None)
retrieve ('input', None)
1816:~/mypy$ python stack36877714.py -o output
opts Namespace(input=None, input_data=None, output='output', targets=None)
retrieve (None, 'output')
함수는 다음과 같이 작성할 수 있습니다.
def retrieve(in_arg, out_arg):
if in_arg is None:
data = sys.stdin.read()
# cannot open/close stdin
else:
with open(in_arg,'r') as f:
data = f.read()
if out_arg is None:
# write to sys.stdout
else:
# write to open(out_arg,'w')
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다