如何使我的代码停止?(不杀戮/打断)

2024-10-01 19:33:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我问这个问题的范围更广,因为我现在没有面对这个具体的问题,但我想知道今后怎么做。你知道吗

如果我有一个长时间运行的python脚本,那么它应该一直在做一些事情(如果这有帮助的话,可以是一个infine循环)。代码是通过在终端上运行python main.py命令来启动的。你知道吗

代码没有结尾,因此不会有sys.exit()。你知道吗

我不想使用键盘中断,也不想终止任务。因为这些选项很突然,您无法准确预测何时停止代码。你知道吗

当我最终决定使用fo时,有没有一种方法可以“柔和地”终止代码?例如,使用另一个命令、准备一个类或运行另一个脚本?你知道吗

这方面的最佳做法是什么?你知道吗

附言:请记住,我是个新手。你知道吗

编辑: 为了让我的问题更清楚,我添加了一些通用代码。你知道吗

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文件中。我如何编写一种方法停止它(当调用uppon时,出乎意料),而不突然中断(Ctrl+C或killing task)。你知道吗


Tags: csv方法代码import命令self脚本data
2条回答

基于@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()

我建议使用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循环中输入的内容不会中途中断。你知道吗

相关问题 更多 >

    热门问题