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

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

Заключить:

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

Ответы

Ответ 1

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

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

Ответ 2

В системе * 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')

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)

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
$

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

: -D

ПОВЕСЕЛИСЬ!

-ox

Ответ 4

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

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.

Ответ 5

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