2013-06-27 44 views
23

我最近開始學習python。我用Django創建了一些基本的Web應用程序,並編寫了一些簡單的腳本。在使用VIM作爲Python IDE後,我真的愛上了「終端程序」(這是否有官方稱謂?)。現在我可以做一些簡單的事情,比如詢問某人的年齡並將其打印到屏幕上。然而,這涉及到運行一個.py腳本,並在此腳本完成後,正常的bash返回。我想要創建一個可以從命令行運行的程序,並且可以提供與VIM(打開和關閉)相同的用戶體驗。例如,我創建了一個簡單的腳本來導入RSS提要。這將是很酷,如果我可以打開我的終端類型我的程序的名稱 - >程序將打開 - >然後我想使用命令:findsomething。基本上與我的程序有真正的互動。用Python創建終端程序

總之:

  • 我怎麼會去建立這樣一個計劃?
  • 如果你想創建一個UNIX系統的獨立的二進制類型的模塊,書籍或網站,你會推薦什麼
+4

你描述什麼是終端的應用程序,而不是一個命令行程序 – Eric

回答

18

一個真正的命令行程序是lsgrep;它是從命令行啓動的,但它是非交互式的,可以在管道中使用並與其他程序結合使用。一個典型的命令行程序沒有交互式用戶體驗,而是依靠shell的歷史記錄和init文件進行定製。

你想要創建的是一個curses應用程序,它使用TTY的全部功能作爲交互式平臺,無論好壞。要做到這一點,請查閱curses

+0

感謝我開始學習詛咒模塊。似乎正是我正在尋找的! – Niels

0

,使用freeze。如果你想要一個Windows系統,請查看py2exe。要控制屏幕上輸出的位置,請使用curses模塊。

3

最簡單的方式做一個互動的控制檯應用程序將是:

while True: 
    command = raw_input('command? ').strip() 
    if command == 'say_hello': 
     print('Hello') 
    elif command == 'other_thing': 
     print('Doing something else') 
    elif command == 'quit': 
     break 
    else: 
     print('Invalid Command.') 

這是基本的結構。如果你想要更類似vim的東西,你可能需要使用curses庫。

20

在* nix系統(LINUX/UNIX),
如果您:

$ chmod 0744 your_file.py 

-rwxr--r-- your_file.py 

和路徑添加到蟒蛇爲your_file.py第一行:

#!/usr/bin/python 

或(在我的情況):

#!/usr/local/bin/python 

一旦你這樣做,而不是跑寧這樣的:

$ python your_file.py 

您可以像這樣運行:

$ ./your_file.py 

,甚至其重命名爲yourfile像這樣運行:

$ ./yourfile 

,如果你再複製yourfile到您的箱(即#!/usr/bin/,或#!/usr/local/bin/) 你可以像這樣運行:

$ yourfile 

然後你就可以...

使用raw_input()徵求和你的用戶得到輸入。

your_file.py

#!/usr/local/bin/python 

import os 

while(True): 
    # cntrl-c to quit 
    input = raw_input('your_prompt$ ') 
    input = input.split() 
    if input[0] == 'ls': 
     dire = '.' 
     if len(input) > 1: 
      dire = input[1] 
     print('\n'.join(os.listdir(dire))) 
    else: 
     print('error') 

your_file.py使用例如:

$ chmod 744 your_file.py 
$ cp your_file.py /usr/local/bin/your_file 
$ your_file 
your_prompt$ ls 
list_argv.py 
your_file.py 
your_ls.py 
your_subprocess.py 
your_prompt$ ls . 
list_argv.py 
your_file.py 
your_ls.py 
your_subprocess.py 
your_prompt$ pwd 
error 
your_prompt$ ^CTraceback (most recent call last): 
    File "/usr/local/bin/your_file", line 7, in <module> 
    input = raw_input('your_prompt$ ') 
KeyboardInterrupt 
$ 

搶論點sys.argv從命令行當您運行腳本:

list_argv.py

#!/usr/local/bin/python 

import sys 

print(sys.argv) 

list_argv.py使用例如:

$ python list_argv.py 
['list_argv.py'] 
$ python list_argv.py hello 
['list_argv.py', 'hello'] 
$ python list_argv.py hey yo 
['list_argv.py', 'hey', 'yo'] 

$ chmod 744 list_argv.py 
$ ./list_argv.py 
['./list_argv.py'] 
$ ./list_argv.py hi 
['./list_argv.py', 'hi'] 
$ ./list_argv.py hey yo 
['./list_argv.py', 'hey', 'yo'] 

$ cp list_argv.py /usr/local/bin/list_argv 
$ list_argv hey yo 
['/usr/local/bin/list_argv', 'hey', 'yo'] 

更換raw_input()sys.argv

'your_ls.py':

#!/usr/local/bin/python 

import sys 
import os 

dire = '.' 
if len(sys.argv) > 1: 
    dire = sys.argv[1] 
print('\n'.join(os.listdir(dire))) 

'your_ls.py' 使用例如:

$ chmod 744 your_ls.py 
$ cp your_ls.py /usr/local/bin/your_ls 
$ your_ls 
list_argv.py 
your_file.py 
your_ls.py 
your_subprocess.py 
$ your_ls . 
list_argv.py 
your_file.py 
your_ls.py 
your_subprocess.py 
$ your_ls blah 
Traceback (most recent call last): 
    File "/usr/local/bin/your_ls", line 9, in <module> 
    print('\n'.join(os.listdir(dire))) 
OSError: [Errno 2] No such file or directory: 'blah' 

使用subprocess.Popen在命令行訪問任何你能。

your_subprocess.py

#!/usr/local/bin/python 

import os 
import subprocess 

while(True): 
    # cntrl-c to quit 
    input = raw_input('your_prompt$ ') 

    process = subprocess.Popen(input, shell=True, 
          stdout=subprocess.PIPE, 
          stderr=subprocess.PIPE) 

    out, err = process.communicate() 

    print(out) 
    print(err) 

your_subprocess.py使用例如:

$ chmod 744 your_subprocess.py 
$ cp your_subprocess.py /usr/local/bin/your_subprocess 
$ your_subprocess 
your_prompt$ ls 
list_argv.py 
your_file.py 
your_ls.py 
your_subprocess.py 


your_prompt$ ls . 
list_argv.py 
your_file.py 
your_ls.py 
your_subprocess.py 


your_prompt$ pwd 
/Users/ox/_workspace/cmd_ln 


your_prompt$ blah 

/bin/sh: blah: command not found 

your_prompt$ ^CTraceback (most recent call last): 
    File "/usr/local/bin/your_subprocess", line 8, in <module> 
    input = raw_input('your_prompt$ ') 
KeyboardInterrupt 
$ 

BREAK的東西!

:-D

有趣!

-ox

+1

謝謝!你的答案是非常有用的。你知道如何通過pip或brew來安裝python命令行應用嗎? – Howard

+0

'sudo pip install ipython' 如果你是在python虛擬環境中,拿着'sudo'和 結帳ipython notebook: 'pip install ipython [notebook]' 它太酷了! –