如何使我的代码可停止? (不杀死/打扰)

时间:2019-07-11 02:06:45

标签: python

我在更广泛的范围内提出这个问题,因为我现在还没有面对这个特定的问题,但是我想知道将来该怎么做。

如果我的Python脚本运行时间很长,那应该一直在做某事(如果有帮助,可以是infine循环)。通过在终端上运行python main.py命令来启动代码。

该代码没有结尾,因此不会有sys.exit()

我不想使用KeyboardInterrupt,也不想取消任务。由于这些选项是突然的,因此您无法准确预测停止代码的时间

当我最终决定使用该代码时,是否有办法“软”地终止该代码?例如,使用另一个命令,准备一个类或运行另一个脚本?

最佳做法是什么?

PS ::请记住,我是新手。

编辑: 我添加一些通用代码,以使问题更清楚。

import time,csv

import GenericAPI

class GenericDataCollector:
    def __init__(self):
        self.generic_api = GenericAPI()

    def collect_data(self):
        while True: #Maybe this could be a var that is changed from outside of the class?
            data = self.generic_api.fetch_data() #Returns a JSON with some data
            self.write_on_csv(data)
            time.sleep(1)

    def write_on_csv(self, data):
        with open('file.csv','wt') as f:
            writer = csv.writer(f)
            writer.writerow(data)

def run():
    obj = GenericDataCollector()
    obj.collect_data()

if __name__ == "__main__":
    run()

在这种特殊情况下,该类正在从某个通用API(JSON中提供)收集数据,并将其无限循环地写入csv文件中。我如何编码一种方法(方法?)以在不突然中断(Ctrl + C或杀死任务)的情况下停止该方法(当称为uppon时,如此出乎意料)。

2 个答案:

答案 0 :(得分:4)

我建议使用signal模块。这使您可以处理信号中断(SIGINT)并在退出之前清理程序。以下面的代码为例:

import signal

running = True

def handle(a, b):
    global running
    running = False

# catch the SIGINT signal and call handle() when the process
# receives it
signal.signal(signal.SIGINT, handle)

# your code here
while running:
    pass

您仍然可以使用Ctrl+C退出,但是您放入while循环中的内容不会被中途切断。

答案 1 :(得分:1)

基于@Calder White,如何处理(未测试)

import signal
import time,csv
import GenericAPI

class GenericDataCollector:
   def __init__(self):
     self.generic_api = GenericAPI()
     self.cont = True

   def collect_data(self):
     while self.cont:
       signal.signal(signal.SIGINT, self.handle)
       data = self.generic_api.fetch_data() #Returns a JSON with some data
       self.write_on_csv(data)
       time.sleep(1)

   def handle(self):
     self.cont = False

   def write_on_csv(self, data):
     with open('file.csv','wt') as f:
       writer = csv.writer(f)
       writer.writerow(data)

def run():
  obj = GenericDataCollector()
  obj.collect_data()

if __name__ == "__main__":
  run()