2012-02-18 2 views
4

대화 형 셸 유형 응용 프로그램을 만들고 싶습니다. 예를 들면 :Python 대화 형 셸 유형 응용 프로그램

> ./app.py 

Enter a command to do something. eg `create name price`. 
For to get help, enter "help" (without quotes) 

> create item1 10 
Created "item1", cost $10 

> del item1 
Deleted item1 

> exit 
... 

나는 물론 명령의 개별 부품을 얻을 수있는 라인을 분할, 사용자의 입력을 받고 infinte 루프를 사용할 수 있지만 더 좋은 방법이 있나요? PHP (Symfony 2 Console)에서도 콘솔 명령을 만들어 웹 응용 프로그램을 설정하는 데 도움을 줄 수 있습니다. 파이썬에서 그런 것이 있습니까? (파이썬 3을 사용하고 있습니다.)

답변

8

그냥 input 루프의 명령.

입력을 구문 분석하려면 shlex.split이 좋은 옵션입니다. 아니면 그냥 일반 str.split으로 이동하십시오.

import readline 
import shlex 

print('Enter a command to do something, e.g. `create name price`.') 
print('To get help, enter `help`.') 

while True: 
    cmd, *args = shlex.split(input('> ')) 

    if cmd=='exit': 
     break 

    elif cmd=='help': 
     print('...') 

    elif cmd=='create': 
     name, cost = args 
     cost = int(cost) 
     # ... 
     print('Created "{}", cost ${}'.format(name, cost)) 

    # ... 

    else: 
     print('Unknown command: {}'.format(cmd)) 

readline 라이브러리에는 기록 기능 (위쪽 화살표) 이상이 추가됩니다. 파이썬 대화 형 셸은 그것을 사용합니다.

+0

매우 도움이되는, 훌륭한 대답 @OlehPrypin. 감사! – Phil

+0

파이썬 3임을 나타 내기 위해 답변에 주석을 달 수는 없을 것이라고 생각합니다. 질문에이 질문이 나온다는 것을 알고 있지만, 질문의 제목을 읽은 후 우리 중 일부는 답변으로 건너 뜁니다. * args와 입력 대 raw_input 기능이 모두 나에게 새롭기 때문에 나는 이것을 조금만 넘어 섰다. – sage

+0

@sage 이전 버전의 Python을 사용하는 것이 문제입니다. 나는 당신이 생각한대로 새로운 버전의 것을 사용하도록 지시해야한다고 생각하지 않는다. 또한 [[tag : python-3.x] 태그도 있습니다. 또한 파이썬 2.7 용으로 수정하는 것도 사소한 일이다. –

0

argparse을 살펴 보겠습니다.

당신이 물어 보는 것처럼 완벽한 대화 형 셸을 제공하지는 않지만 PHP 예제와 비슷한 기능을 만드는 데 도움이됩니다.

+1

실행되며 피장 ​​장이 된. 나는 "대화 형"인 무언가가 필요하다. 감사하지만 –

1

이와 같은 대화 형 응용 프로그램을 빌드하는 또 다른 방법은 cmd 모듈을 사용하는 것입니다.

# app.py 
from cmd import Cmd 

class MyCmd(Cmd): 

    prompt = "> " 

    def do_create(self, args): 
     name, cost = args.rsplit(" ", 1) # args is string of input after create 
     print('Created "{}", cost ${}'.format(name, cost)) 

    def do_del(self, name): 
     print('Deleted {}'.format(name)) 

    def do_exit(self, args): 
     raise SystemExit() 

if __name__ == "__main__": 

    app = MyCmd() 
    app.cmdloop('Enter a command to do something. eg `create name price`.') 

그리고 여기가 (위의 코드는 app.py라는 이름의 파일 인 경우) 위의 코드를 실행의 출력입니다 : 한 번 예, 주요 문제는 그것이 것을 보았다

$ python app.py 
Enter a command to do something. eg `create name price`. 
> create item1 10 
Created "item1", cost $10 
> del item1 
Deleted item1 
> exit 
$ 
관련 문제