Создание терминальной программы с помощью Python

Недавно я начал изучать питон. Я создал некоторые базовые webapps с Django и написал несколько простых скриптов. После использования VIM в качестве Python IDE я действительно упал, я обожаю «Терминальные программы» (есть ли официальный термин для этого?). Сейчас я способен делать простые вещи, например, задавать возраст кому-то и печатать его на экране. Однако это сводится к запуску сценария .py, и после этого сценария выполняется нормальное возвращение bash. Я хотел бы создать программу, которую я могу запустить из командной строки, и это позволит использовать тот же пользовательский интерфейс, что и VIM (тот, который вы открываете и закрываете). Например, я создал простой скрипт для импорта RSS-каналов. Было бы здорово, если бы я мог открыть свой тип терминала, имя моей программы -> program open -> Then, я бы хотел использовать команды вроде: findomething. В основном есть реальное взаимодействие с моей программой.

Заключить:

  • Как мне приступить к созданию такой программы?
  • Какие модули, книги или сайт вы бы порекомендовали

Истинная программа командной строки – это что-то в духе ls или grep ; он запускается из командной строки, но он неинтерактивен и может использоваться в конвейерах и в сочетании с другими программами. Типичная программа командной строки не имеет интерактивного пользовательского опыта, вместо этого полагаясь на историю оболочки и файл инициализации для настройки.

То, что вы хотите создать, – это приложение curses , которое использует все возможности TTY в качестве интерактивной платформы, к лучшему или к худшему. Чтобы сделать это, найдите проклятия .

В системе * nix (linux / unix),
если вы:

 $ chmod 0744 your_file.py -rwxr--r-- your_file.py 

и добавьте путь к python как первую строку 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') в #!/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 использования 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 использования 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) в #!/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 использования 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 $ 

ПЕРЕМЕЩЕНИЕ!

😀

ПОВЕСЕЛИСЬ!

-ox

Вы должны взглянуть на модуль cmd .

См. Поваренную книгу Python для примеров ее использования.

Самый простой способ сделать интерактивное консольное приложение:

 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-like, вам, вероятно, понадобится использовать библиотеку curses.

Если вы хотите создать автономный двоичный код для системы UNIX, используйте функцию « freeze . Если вы хотите один для системы Windows, посмотрите на py2exe . Чтобы управлять местоположениями вывода на экране, используйте модуль curses .