结束目标:等待后台作业完成的BASH脚本首先不会中止Ctrl-c; 相反,它需要一秒钟Ctrl-c退出.
我很清楚BASH-builtin的trap工作原理.你可以:
用它来完全忽略一个信号(例如trap '' 2)......或
在允许信号原始函数发生之前使用它来执行任意命令(例如,在父脚本因中断而运行的trap cmd 2地方cmd运行SIGINT)
所以问题归结为:
我怎样才能有效地结合1&2一起,即防止最终结果的信号会导致(1 -例如,停止脚本由于取消
SIGINT),同时也使该信号引起其他的东西(2 -例如,递增计数器,检查计数器并有条件地打印警告或退出).
更简单地说:
我怎样才能发出信号呢?不只是在它完成它之前插入一个工作.
这是一些示例代码,用于演示我的目标; 然而,它当然不起作用 - 因为trap只能从上面做1或2.
#!/bin/bash
declare -i number_of_times_trap_triggered
cleanup_bg_jobs() {
number_of_times_trap_triggered+=1
if [[ ${number_of_times_trap_triggered} -eq 1 ]]; then
echo "There are background jobs still running"
echo "Hit Ctrl-c again to cancel all bg jobs & quit" …Run Code Online (Sandbox Code Playgroud) 过去,我some_fancy_printing_loggin_func(yaml.dump(...), ...)使用 ruamel.yaml 的向后兼容部分做了类似的事情,但我想将我的代码转换为使用最新的 API,以便我可以利用一些新的格式设置。
但是,我讨厌我必须指定一个流来ruamel.yaml.YAML.dump()......我不希望它直接写入流;我只是想让它把输出返回给调用者。我错过了什么?
PS:我知道我可以做类似以下的事情,当然我试图避免它。
f = io.StringIO()
yml.dump(myobj, f)
f.seek(0)
my_logging_func(f.read())
Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我使用一个函数来显示带有超时的GtkInfoBars(如/sf/answers/91648021/所述),这要归功于glib.timeout_add_seconds().
我知道glib.timeout_add_seconds()应该设置一个定期调用的函数,直到所述函数返回False.
我不这样做,但一切都按预期工作.这很简单.这是我的代码:
def infobar(self, message, msgtype=gtk.MESSAGE_INFO, timeout=5):
bar = gtk.InfoBar()
bar.set_message_type(msgtype)
bar.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK)
bar.connect("response", lambda *args: bar.hide())
self.vb2.pack_end(bar, False, False)
label = gtk.Label()
label.set_markup(message)
content = bar.get_content_area()
content.add(label)
label.show()
bar.show()
if timeout:
glib.timeout_add_seconds(timeout, bar.hide)
Run Code Online (Sandbox Code Playgroud)
所以.提问时间.看看我在最后一行做了些什么.简单地说,这没关系吗?在第二次调用bar.hide()失败后,超时是否会自行消失?或者我是否累积了额外的超时超时,这会在每5秒(技术上)耗尽资源时唤醒?
作为附录:
如果我怀疑这是坏的,我确实需要返回False以消除超时,我需要一些帮助 - 我无法弄清楚如何使用代码来满足这些条件:我需要同时允许多个InfoBars,每个InfoBars仍然保持连接到他们自己的计时器和按钮响应信号(现在是代码)或者我需要每个新的InfoBar来替换任何以前的InfoBar(我无法弄清楚如何要做到这一点而不继承前一个InfoBar中的计时器 - 它会变得混乱).
谢谢阅读!
在stackoverflow上研究这个问题的答案时,我已经学到了很多新东西,但到目前为止还无法完成交易.
我的python进程将通过stdin接收一行输入,例如
[{'name':'ry', 'age':28}, {'name':'bo', 'age':11}, {'name':'ed', 'age':99}]
Run Code Online (Sandbox Code Playgroud)
...我希望能够将此行直接存储到列表对象中,然后我可以迭代,例如
for i in list:
print i['age'], i['name']
Run Code Online (Sandbox Code Playgroud)
...但是我无法使用它,无论是使用sys.stdin()还是fileinput模块.例如,即使我明确地创建一个列表,x = list(stdin.readline())它最终会使每个字符成为列表中的单独项目,而不是按照我想要的方式解析文本.无论如何..回到搜索.(谢谢阅读.)