2016-10-13 3 views
0

Я пытаюсь написать простую программу, которая запускает программу на Python и проверяет полученный выходной файл:Как поймать Cntrl + C в скрипт, который запускает скрипт Python

#!/bin/bash 

rm archived_sensor_data.json 
python rethinkdb_monitor_batch.py 
trap "gedit archived_sensor_data.json" 2 

питон скрипт rethinkdb_monitor_batch.py работает неограниченно и записывает (в режиме только append) в файл archived_sensor_data.json. Чтобы каждый раз запускать «чистый сланец», я хотел бы удалить файл каждый раз перед запуском. Затем, после прерывания выполнения с помощью Cntrl + C, я хотел бы автоматически запускать открытие файла с помощью Gedit.

Проблема в том, что, когда я нажимаю Cntrl + C, он, похоже, не открывает Gedit автоматически. Есть 2 не правильный код выхода для использования здесь?

ответ

2

Вы может сделать это, захватив сигнал внутри rethinkdb_monitor_batch.py следующим образом:

#!/usr/env/bin python 

try: 
    # your existing code here---let's assume it does the following: 

    import time 
    outfile = open("archived_sensor_data.json", "wt") # NB: this already does the job of erasing previous content 
    while True: 
     outfile.write("There's a horse in aisle five.\n") 
     time.sleep(1) 
     outfile.write("My house is full of traps.\n") 
     time.sleep(1) 

except KeyboardInterrupt: 
    print("You pressed Ctrl-C") 

... и сценарий обертку затем просто:

#!/bin/bash 

python rethinkdb_monitor_batch.py 
gedit archived_sensor_data.json 

Но на самом деле, зачем с оберткой, когда вы могли бы сделать все это в Python, заменяя окончательный print() вызов следующим образом:

except KeyboardInterrupt: 
    os.execlp("gedit", "archived_sensor_data.json") 

... а затем просто вызвать скрипт Python непосредственно из командной строки.

0
 

    import signal 
    import os 
    os.system("rm archived_sensor_data.json") 
    def signal_handler(signal, frame): 
      print('You pressed Ctrl+C!') 
      os.system("gedit archived_sensor_data.json") 
    signal.signal(signal.SIGINT, signal_handler) 
    #your remaining code 
    #must be placed here 



Просто запустите ваш код, используя следующую команду

$ питон rethinkdb_monitor_batch.py ​​

Это должно решить вашу проблему
обработчик сигнала чтения для получения дополнительной информации

0

Другие ответы включают в себя модификацию самого кода Python, который является менее идеальным, поскольку я не хочу, чтобы он содержал код, связанный только с тестированием. Вместо этого, я обнаружил, что следующий Баш скрипт полезен:

#!/bin/bash 

rm archived_sensor_data.json 
python rethinkdb_monitor_batch.py ; gedit archived_sensor_data.json 

Это запустит команду gedit archived_sensor_data.json после python rethinkdb_monitor_batch.py закончена, независимо от того, вышел ли он успешно.

+0

Вместо того чтобы модифицировать исходный файл Python, вы всегда могли бы его обернуть вторым файлом Python, который будет включать предложение 'except KeyboardInterrupt' после' try: execfile ('rethinkdb_monitor_batch.py') ' – jez

Смежные вопросы