我在更广泛的范围内提出这个问题,因为我现在还没有面对这个特定的问题,但是我想知道将来该如何做。
如果我运行的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()
Run Code Online (Sandbox Code Playgroud)
在这种特殊情况下,该类从某个通用API(JSON中提供)收集数据,并将其无限循环地写入csv文件中。我如何编码一种方法(方法?)以在不突然中断(Ctrl + C或杀死任务)的情况下停止该方法(当称为uppon时,如此出乎意料)。
我建议使用该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
Run Code Online (Sandbox Code Playgroud)
您仍然可以使用 a 退出Ctrl+C,但是您放入 while 循环中的内容不会被中途切断。