Попутная путаница - перенаправление вывода, методы не работают

Проблема в том, что процесс не запускается. Объект создан, но процесса нет и не было.

Если я поставлю time.sleep () перед оператором os.kill, я потеряю контроль. Процесс запускается, но не останавливается. Кроме того, мой стандартный вывод потерян. Все, что я набираю, не отображается (я думаю, это тоже будет нулевым). Мне нужно закрыть терминал, открыть новый и вручную убить процесс (запуск python и выдача этой точной команды выполняет свою работу, что полезно знать)

airodump = subprocess.Popen('airodump-ng -w outputfile mon0',shell=True,stdout=open('/dev/null', 'w'), stderr=open('/dev/null', 'w'))
#time.sleep(5)
os.kill(airodump.pid, signal.SIGTERM)   # airodump-ng
#airodump.wait()
print airodump

Я пробовал вызывать методы Popen.terminate (), Popen.kill (). Я что-то упускаю с Попеном ....

Даже когда я добавляю Popen.wait () перед «print airodump», он просто игнорируется и печатается адрес объекта. Эта маленькая причуда убедила меня в том, что в моем понимании происходящего что-то не так.


person ojef    schedule 24.10.2012    source источник
comment
куда вы хотите направить стандартный вывод? Вы говорите, что он потерян, но вы отправляете его «/ dev / null».   -  person Bi Rico    schedule 24.10.2012
comment
мне все равно, куда идет stdout, просто делаю это для удобства. все, что я хочу, - это запустить airodump на несколько секунд, затем остановить (убить процесс) и вернуть программе функциональность.   -  person ojef    schedule 24.10.2012
comment
все, что меня волнует, - это созданный файл. Мне просто интересно, что stdout, отправляемый в null, переносится   -  person ojef    schedule 24.10.2012


Ответы (1)


Ты должен попытаться:

airodump = subprocess.Popen(['airodump-ng', '-w', 'outputfilename', 'mon0'],
                            stdout=subprocess.PIPE, stderr=subprocess.PIPE)
time.sleep(secs)
airodump.terminate()
return_code = airodump.wait()

Обратите внимание, я заменил вашу строковую команду списком, отбросил shell = True и stdout. Сначала shell = True усложняет отладку, поэтому вы должны попробовать запустить это без него, но для этого вам нужно использовать список для вашей команды, а не строку.

Более стандартный способ захвата stdout / stderr и предотвращения их вывода на экран - использовать stdout=subprocess.PIPE. Если вы все еще не можете заставить это работать должным образом, попробуйте проверить airodump.stdout и airodump.sterr, чтобы узнать, что происходит с вашим процессом. Надеюсь, этого достаточно, чтобы вы начали.

person Bi Rico    schedule 24.10.2012
comment
О боже. это сработало. кто-то предложил удалить shell = true, но я не понимал, что команда должна быть в списке (я получил сообщение об ошибке, не мог понять, почему). Большое спасибо, сэр - person ojef; 24.10.2012