Python как shell
Материал из Xgu.ru
Содержание |
[править] Интерактивный интерпретатор Python
[править] Дополнительная информация
[править] Работа с подпроцессами в Python
Вопросы параллельного запуска нескольких подпроцессов подробно разбираются здесь:
- http://stackoverflow.com/questions/14533458/python-threading-multiple-bash-subprocesses
- http://stackoverflow.com/questions/9874042/using-pythons-multiprocessing-module-to-execute-simultaneous-and-separate-seawa/9874484#9874484
[править] Вопросы и ответы
[править] Как максимально облегчить написание shell-подобных программ на Python?
Можно использовать IPython.
Кроме того есть несколько модулей, которые существенно упрощают выполнение стандартных для shell-операций в питоне:
- sarge (англ.), мощный враппер для subprocess, существенно упрощающий его использование
- plumbum (англ.)
- http://amoffat.github.io/sh/
[править] Как нынче правильно считывать данные из внешних программ?
Другими словами, как правильно организовывать pipe?
Раньше для этого можно было использовать функции popen, popen2, popen3 и тому подобные. Сейчас лучше использовать модуль subprocess. Его использовать и проще, и нагляднее.
import subprocess
print '\npopen3:'
proc = subprocess.Popen('cat -; echo ";to stderr" 1>&2',
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
stdout_value, stderr_value = proc.communicate('through stdin to stdout')
print '\tpass through:', repr(stdout_value)
print '\tstderr:', repr(stderr_value)
Конечно, при таком подходе есть небольшая проблема: данные будут выдаваться не сразу, а все скопом, когда процесс завершится. Кроме того, текущий процесс, в котором вызывается дочерний процесс, будет блокироваться.
Чтобы передавать данные в реальном времени, можно использовать такую конструкцию ([1], Nadia Alramli):
import subprocess
import sys
process = subprocess.Popen(
cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
while True:
out = process.stdout.read(1)
if out == '' and process.poll() != None:
break
if out != '':
sys.stdout.write(out)
sys.stdout.flush()
Надя просто читает побайтно поток и выводит его дальше. Конечно, это не очень быстро, если передаётся значительное количество данных. Обойти проблему можно таким образом ([2], Derrick Petzold):
fcntl.fcntl(
proc.stdout.fileno(),
fcntl.F_SETFL,
fcntl.fcntl(proc.stdout.fileno(), fcntl.F_GETFL) | os.O_NONBLOCK,
)
while proc.poll() == None:
readx = select.select([proc.stdout.fileno()], [], [])[0]
if readx:
chunk = proc.stdout.read()
print chunk
Можно читать не только байты, но и строки с помощью proc.stdout.readline()
Дополнительная информация:
[править] Дополнительная информация
[править] Работа с внешними процессами
[править] А если нужно не только считывать, но и записывать данные, то есть организовать диалог с программой?
Да, есть модули, обладающие функциональностью наподобие expect. Например, модуль pexpect.
import pexpect
child = pexpect.spawn ('ftp ftp.openbsd.org')
child.expect ('Name .*: ')
child.sendline ('anonymous')
child.expect ('Password:')
child.sendline ('noah@example.com')
child.expect ('ftp> ')
child.sendline ('cd pub')
child.expect('ftp> ')
child.sendline ('get ls-lR.gz')
child.expect('ftp> ')
child.sendline ('bye')
Читать данные, которые передаются программе или программой:
child.logfile_read = sys.stdout child.logfile_send = sys.stdout
Или объединённый:
child.logfile = sys.stdout
Подробнее:
- http://www.noah.org/wiki/Pexpect
- pexpect Exit Status (англ.)
- Module pexpect (англ.)
[править] Как создать программу-демон?
- Creating a daemon the Python way (англ.)
- Daemon processes on windows (англ.)
[править] Как написать программу-демон на питоне?
Если у вас есть модуль daemon[1] (реализация PEP-3143), то всё совсем элементарно:
import daemon
from spam import do_main_program
with daemon.DaemonContext():
do_main_program()
Если же модуль этот по каким-то причинам отсутствует и доустановить его нельзя, то можно воспользоваться кодом отсюда:
[править] Примечания
| Информация о Python на xgu.ru | ||
|---|---|---|
| Реализации | Cython • Psyco • PyPy | |
| Веб-фреймворки | Django • Flask • Zope | |
| IDE | Pydev • NetBeans | |
| Курсы | Python для сетевых инженеров | |
| Другое | aalib • ctypes • gevent • mpmath • pjsua • Pandas • pyparsing • virtualenv • GMPY • IPython • Jinja2 • Python и Vim • Работа с модулями в Python • SWIG • Scapy • SciPy • Работа с датой и временем в Python • Python как shell • Web и Python • Алгоритмы, сложные структуры данных и дискретная математика в Python • Анализ кода Python • Интеграция Python с другими языками • Объекты и классы в Python • Оформление кода Python • Параллелизм и конкурентное исполнение в Python • Профайлинг в Python • Работа с базами данных в Python • Работа с операционной системой в Python • Работа с сетью в Python • Работа с текстами в Python • Работа с файлами в Python • Сравнение Python с другими языками • Тестирование в Python • Типы в Python • Элементы функционального программирования в Python • Элементы языка Python | |