2012-02-18 38 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)でも、たとえば、Webアプリケーションの設定に役立つコンソールコマンドを作成できます。 Pythonのようなものがありますか(私はPython 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ライブラリーは、履歴機能(上矢印)とよりを追加します。 Pythonのインタラクティブシェルはそれを使用します。

+0

非常に非常に有用な、優れた答え@OlehPrypin。ありがとう! – Phil

+0

あなたの答えがPython 3であることを示すためにあなたの答えに注釈を付けるつもりはないと思います。私はこの質問がこれを言うことを知っていますが、質問のタイトルを読んだ後、 * argsと入力対raw_inputの両方の機能が私には新しかったので、私はちょっとこれでうまく行きました。 – sage

+0

@sage Pythonの古いバージョンを使用するのはあなたの問題です。あなたが考えるように、私は何かの新バージョンを使用することを指示しなければならないと思います。また、[[tag:python-3.x]というタグもあります。また、Python 2.7のためにそれを修正することは、やや些細なことです。 –

0

argparseから見ることができます。

あなたが尋ねるような完全な対話シェルを提供するわけではありませんが、PHPの例に似た機能を作成するのに役立ちます。

+1

はい、私は主な問題は、それが一度に実行され、ことを見ました終了する。私は "インタラクティブ"なものが必要です。しかし、ありがとう –

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 
$ 
関連する問題