Найти - Пользователи
Полная версия: shell и subrocess.Popen (в чём разница)
Начало » Python для новичков » shell и subrocess.Popen (в чём разница)
1
dll090
Здравствуйте,

Есть shell скрипт в котором перезагружаются/останавливаются/запускаются службы FreeBSD


так вот если запускать этот скрипт просто из консоли, - он отрабатывает нормально (за секунды три)
но если сделать тот же запуск из питона:
subprocess.Popen(['script.sh'], shell=True)
скрипт подвисается в ожидании завершения службы mpd5; ответа я от него не дождался

Вопрос не конкретно по данной службе а в целом, в чём разница то?
Переменные окружения, ещё что то?
Какие есть варианты как можно это обойти?
Предположения?

Был похожий топик, но там нет ответа

P.S.: скрипт запускается из по рута.
Enchantner
proc = subprocess.Popen(['script.sh'], shell=True, executable='/bin/bash')
proc.wait()
Не так?
dll090
Хм, а разве при использовании параметра shell = True питон не станет запускать это в шелле по умолчанию (для FreeBSD это /bin/sh) и нужно явное указание?

Не на чем сейчас проверить, завтра на работе проверю, - отпишусь
dll090
Ничего не изменилось, эффект тот же.

Added:

Не думал что вообще есть разница: на самом деле скрипт вызывающий команду, запущен как сервер.

А если сделать так:
Cервер пишет в файл команду.
Другой демон, раз в 1 сек проверяет если там что то. И если есть - то выполняет и очищает файл.
- Так работает нормально, но это какое то костыльное решение.

Буду думать дальше..
o7412369815963
на крайний случай можно os.system() попробовать
bw
Может так правильнее?
import subprocess

process = subprocess.Popen(['script.sh'], shell = True, stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
process.stdout.read()
А вообще, учимся читать первоисточник:
# Python 2.6.6
# subprocess.py:1030
# ...
if shell:
args = ["/bin/sh", "-c"] + args
if executable:
args[0] = executable
# ...
..bw
dll090
o7412369815963

Пробовал, без разницы в принципе.


bw

А почему в данном случае так должно быть правильнее?
Это же зависит от задачи куда мне нужно перенаправлять потоки, и нужно ли видеть stderr.
А вообще я собирал и strdout и stderr, в том то и дело что ошибок нет видимых, на определённом шаге команда просто подвисает. В логе демона (mpd5, - который останавливается, - тоже нет ошибок)

PS: А насчёт того что бы читать первоисточник, согласен конечно, надо посмотреть что там как
o7412369815963
а если попробовать в Popen подставить окружение которое пришло из вне?: env = os.environ
dll090
И так тоже не помогает. И что характерно что проблема только с остановкой служб. С запуском проблем нет.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB