Создание терминальной программы с помощью 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
Ответ 3
Вы должны взглянуть на модуль cmd.
См. Поваренную книгу Python для примеров ее использования.
Ответ 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
.