2011-05-10 49 views
4

我有一个不断轮询数据的python脚本。剧本不断运行,不应停止。Python - 在运行脚本时更新配置

该脚本从首次运行脚本时传递给它的关键字轨道轮询数据。

什么是最好的方式来更新此轨道不停止来自另一个python脚本的脚本?

我能想到的唯一解决方案是将曲目存储在txt文件中,并检查设置定时器上文件的任何更新。似乎有点凌乱。

+0

将配置存储为字典,然后转储并通过json加载。 – 2011-05-10 11:50:44

回答

5

最好是封装此设置文件的数据库进行通信这两个脚本。一个简单的SQLite DB文件就足够了 - SQLite支持是用Python内置的,所以不需要额外的努力。

数据库的优点是不会遇到部分写入文件等竞争条件。“配置添加”脚本使用事务添加关键字,而从数据库中读取的其他脚本将只会当它完全完成时看到它。请记住,不要在定期脚本中始终打开数据库。每隔一段时间打开一次,阅读关键字并关闭它。

+0

我也赞成这个解决方案,但我认为我的答案需要较少的代码来实现相同的结果。 – neurino 2011-05-10 11:48:34

+0

如果我每5-10秒运行一次脚本,关闭数据库还是有意义的吗? – Hanpan 2011-05-10 14:01:38

+1

@Hanpan:无论您的期限如何,关闭SQLite数据库都是必须的。无论如何,5-10秒是永恒的,相对而言,所以不用担心它 – 2011-05-10 14:38:18

3

轮询一个配置文件并不是一团糟,而是一个非常常见的解决这个问题的方法。你应该去用它。

+0

根据文件的大小,操作系统/文件系统和其他因素,我认为这是竞争条件的一个配方。我推荐一个简单的数据库,而不是一个普通的文件 – 2011-05-10 11:32:11

+0

@Eli:我同意,这就是为什么我已经upvoted你的答案。 – 2011-05-10 11:34:07

2

如果您使用Linux,您可以尝试pyinotify。示例here

+0

这实际上很酷。谢谢! – Hanpan 2011-05-10 13:18:28

1

我同意跟踪存储在文件中的数据,然后使用signal module通知您的脚本新的轨迹数据已准备就绪可读,将函数与SIGUSR1联系起来,而且完成了,没有部分写入的风险文件。

在脚本的说:

import signal 

signal.signal(signal.SIGUSR1, read_track_data) 

然后,(linux的方式,但在Windows太大的不同)只要发送信号到你的脚本只是更新您的跟踪数据文件之后。

$kill -n 10 PID_OF_YOUR_SCRIPT 
+0

我很想看到“没有太大的不同,在Windows”解决方案;-) – 2011-05-10 11:48:52

+0

@Eli:这就是为什么我爱Linux ^^ – neurino 2011-05-10 11:50:02

+0

我也爱Linux,但你应该真的删除这个说法,除非你准备好站在后面it – 2011-05-10 11:50:54