2013-06-27 38 views
23

Gần đây tôi đã bắt đầu học python. Tôi đã tạo một số ứng dụng web cơ bản với Django và đã viết một số tập lệnh đơn giản. Sau khi sử dụng VIM như là một IDE Python tôi thực sự rơi tôi yêu với "chương trình Terminal" (là có một thuật ngữ chính thức cho điều này?). Ngay bây giờ tôi có khả năng làm những việc đơn giản như yêu cầu người già và in nó lên màn hình. Tuy nhiên điều này đi xuống để chạy một kịch bản .py và sau khi kịch bản này được thực hiện trở lại bash bình thường. Tôi muốn tạo một chương trình mà tôi có thể chạy từ dòng lệnh và điều đó sẽ cho phép trải nghiệm người dùng giống như VIM (một mà bạn mở và đóng). Ví dụ: tôi đã tạo một tập lệnh đơn giản để nhập các nguồn cấp dữ liệu RSS. Nó sẽ được mát mẻ nếu tôi có thể mở loại thiết bị đầu cuối của tôi tên chương trình của tôi -> chương trình sẽ mở -> Sau đó, tôi muốn sử dụng lệnh như: findomething. Về cơ bản có sự tương tác thực sự với chương trình của tôi.Tạo chương trình Terminal với Python

Để kết luận:

  • Làm thế nào tôi sẽ đi về việc tạo ra một chương trình như vậy?
  • Những loại mô-đun, sách hoặc trang web mà bạn muốn giới thiệu
+4

Những gì bạn đang mô tả là một ứng dụng thiết bị đầu cuối, không phải là một chương trình dòng lệnh – Eric

Trả lời

18

Chương trình dòng lệnh thực sự là nội dung nào đó trong tĩnh mạch ls hoặc grep; nó được bắt đầu từ dòng lệnh, nhưng nó không tương tác và có thể được sử dụng trong các đường ống dẫn và kết hợp với các chương trình khác. Một chương trình dòng lệnh điển hình không có trải nghiệm người dùng tương tác, thay vào đó dựa vào lịch sử của trình bao và tệp init để tùy chỉnh.

Điều bạn muốn tạo là một ứng dụng nguyền rủa, sử dụng toàn bộ khả năng của TTY làm nền tảng tương tác, để tốt hơn hoặc tệ hơn. Để làm điều đó, hãy tra cứu curses.

+0

Cảm ơn Tôi bắt đầu học tập các mô-đun lời nguyền. Dường như chính xác những gì tôi đang tìm kiếm! – Niels

0

Nếu bạn muốn tạo một nhị phân độc lập cho một hệ thống UNIX, sử dụng freeze. Nếu bạn muốn một cho một hệ thống Windows, nhìn vào py2exe. Để kiểm soát vị trí đầu ra trên màn hình của bạn, hãy sử dụng mô-đun curses.

3

Cách đơn giản nhất để làm một ứng dụng giao diện điều khiển tương tác sẽ là:

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.') 

Đó là cấu trúc cơ bản. Nếu bạn muốn một cái gì đó giống vim hơn, có thể bạn sẽ cần phải sử dụng thư viện curses.

8

Bạn nên xem mô-đun cmd.

Xem Python Cookbook để biết ví dụ về việc sử dụng.

20

Trên hệ thống * nix (linux/unix),
nếu bạn:

$ chmod 0744 your_file.py 

-rwxr--r-- your_file.py 

và thêm đường dẫn đến python như dòng đầu tiên của your_file.py:

#!/usr/bin/python 

hoặc (trong trường hợp của tôi):

#!/usr/local/bin/python 

Khi bạn làm điều đó, thay vì chạy ning nó như thế này:

$ python your_file.py 

Bạn có thể chạy nó như thế này:

$ ./your_file.py 

hoặc thậm chí đổi tên nó để yourfile và chạy nó như thế này:

$ ./yourfile 

và nếu bạn sau đó sao chép yourfile vào thùng rác của bạn (ví dụ: #!/usr/bin/, hoặc #!/usr/local/bin/) bạn có thể chạy nó như thế này:

$ yourfile 

Sau đó, bạn có thể ...

Sử dụng raw_input() để thu hút và nhận được thông tin từ bạn dùng.

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 sử dụng ví dụ:

$ 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 
$ 

luận Grab với sys.argv từ dòng lệnh khi bạn chạy script của bạn:

list_argv.py:

#!/usr/local/bin/python 

import sys 

print(sys.argv) 

list_argv.py dụ sử dụng:

$ 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'] 

Thay raw_input() với 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' sử dụng ví dụ:

$ 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' 

Sử dụng subprocess.Popen để truy cập bất cứ điều gì bạn có thể từ dòng lệnh.

your_subprocess.py: ví dụ

#!/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 sử dụng:

$ 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 STUFF!

:-D

CÓ VUI LÒNG!

-ox

+1

Cảm ơn !! Câu trả lời của bạn cực kỳ hữu ích. Bạn có biết cách cài đặt ứng dụng dòng lệnh python bằng pip hay brew không? – Howard

+0

sudo pip cài đặt ipython' giữ 'sudo' nếu bạn đang ở trong một môi trường ảo python và thanh toán ipython máy tính xách tay: ' pips cài đặt ipython [xách tay] ' nó là như vậy hoảng mát mẻ! –

Các vấn đề liên quan