当前位置: 首页 > 科技观察

在Jupyter中每天记录5分钟

时间:2023-03-21 15:28:28 科技观察

使用Jupyter和Python在您的日常写作过程中实现一些自动化。有些人遵循传统并为这一年制定计划。尽管如此,一年还是很长的时间,所以我计划使用季节性主题或曲目。每个季度,我都会坐下来查看即将到来的三个月赛季,并决定在那段时间里我要尝试做什么。对于我的最新话题,我决定每天写一篇日记。我喜欢有明确的承诺,所以我承诺每天写5分钟。我也喜欢有可观察的提交,如果只是为了我的话,所以我将我的记录保存在Git中。我决定自动化我的一些日记,所以我求助于我最喜欢的自动化工具:Jupyter。Jupyter的一个有趣特性是ipywidgets,它是一组用于JupyterNotebooks、JupyterLab和IPython内核的交互式HTML小部件。如果您想按照本文中的代码进行操作,请注意让您的JupyterLab实例支持组件可能有点复杂,请按照这些说明进行设置。导入ipywidgets模块首先,您需要导入一堆东西,例如ipywidgets和Twisted。Twisted模块可用于创建异步时间计数器:importtwisted.internet.asyncioreaactortwisted.internet.asyncioreaactor.install()fromtwisted.internetimportreactor,taskimportipywidgets,datetime,subprocess,functools,ossettimingentriesimplementtimecounters和Twisted是使用task.LoopingCall。但是,结束循环调用的唯一方法是抛出异常。倒计时时钟将始终停止,因此您需要一个自定义异常来指示“一切正常;计数器结束”:classDoneError(Exception):pass现在您已经编写了异常,您可以编写计时器。第一步是创建一个ipywidgets.Label文本标签组件。使用divmod循环计算分秒,然后设置label的文本值:deftime_out_counter(reactor):label=ipywidgets.Label("Timeleft:5:00")current_seconds=datetime.timedelta(minutes=5).total_seconds()defdecrement(count):nonlocalcurrent_secondscurrent_seconds-=counttime_left=datetime.timedelta(seconds=max(current_seconds,0))分钟,left=divmod(time_left,minute)seconds=int(left.total_seconds())标签。value=f"剩余时间:{minutes}:{seconds:02}"如果current_seconds<0:raiseDoneError("finished")minute=datetime.timedelta(minutes=1)call=task.LoopingCall.withCount(decrement)call.reactor=reactord=call.start(1)d.addErrback(lambdaf:f.trap(DoneError))returnd,label从Jupyter组件保存文本下一步是写一些东西来保存你输入的文本在文件中并提交给Git。此外,由于您正在写5分钟的日记,因此您需要一个组件来为您提供一个书写区域(滚动当然没问题,但一次看到更多文本会很不错)。这使用了组件Textarea,这是一个您可以在其中写入的文本字段,以及用于提供反馈的Output。这很重要,因为gitpush可能需要一段时间或失败,具体取决于网络。如果备份失败,用反馈提醒用户很重要:defeditor(fname):textarea=ipywidgets.Textarea(continuous_update=False)textarea.rows=20output=ipywidgets.Output()runner=functools.partial(subprocess.run,capture_output=True,text=True,check=True)defsave(_ignored):withoutput:withopen(fname,"w")asfpout:fpout.write(textarea.value)打印("发送...",end='')try:runner(["git","add",fname])runner(["git","commit","-m",f"updated{fname}"])runner(["git","push"])除了subprocess.CalledProcessErrorasexc:print("Couldnotsend")print(exc.stdout)print(exc.stderr)else:print("Done")textarea.observe(save,names="value")returntextarea,output,savecontinuous_update=False是为了避免保存每个字符并发送给Git。相反,它会在输入焦点丢失时保存。此函数还返回保存函数,因此可以显式调用它。创建布局最后,您可以使用ipywidgets.VBox将这些东西放在一起。这是包含一些组件并垂直显示的东西。还有其他一些排列组件的方法,但这很简单:defjournal():date=str(datetime.date.today())title=f"Log:Startdate{date}"filename=os.path。join(f"{date}.txt")d,clock=time_out_counter(reactor)textarea,output,save=editor(filename)box=ipywidgets.VBox([ipywidgets.Label(title),文本区域,时钟,输出])d.addCallback(save)返回boxbiu!您已经定义了一个写日记的函数,所以是时候尝试一下了。journal()Jupyterjournal您现在可以在5分钟内完成写作!