小编rsa*_*saw的帖子

bash:可能需要双Ctrl-c才能退出脚本?

结束目标:等待后台作业完成的BASH脚本首先不会中止Ctrl-c; 相反,它需要一秒钟Ctrl-c退出.

我很清楚BASH-builtin的trap工作原理.你可以:

  1. 用它来完全忽略一个信号(例如trap '' 2)......或

  2. 在允许信号原始函数发生之前使用它来执行任意命令(例如,在父脚本因中断而运行的trap cmd 2地方cmd运行SIGINT)

所以问题归结为:

我怎样才能有效地结合1&2一起,即防止最终结果的信号会导致(1 -例如,停止脚本由于取消SIGINT),同时也使该信号引起其他的东西(2 -例如,递增计数器,检查计数器并有条件地打印警告或退出).

更简单地说:

我怎样才能发出信号呢?不只是在它完成它之前插入一个工作.

这是一些示例代码,用于演示我的目标; 然而,它当然不起作用 - 因为trap只能从上面做12.

#!/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)

linux bash shell

7
推荐指数
3
解决办法
2285
查看次数

使用 ruamel.yaml 转储到字符串而不是流式传输的最佳方法

过去,我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)

python-3.x ruamel.yaml

7
推荐指数
3
解决办法
6848
查看次数

pygtk glib.timeout_add():如何判断计时器是否被销毁?

在我的应用程序中,我使用一个函数来显示带有超时的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中的计时器 - 它会变得混乱).

谢谢阅读!

python gtk pygtk

4
推荐指数
2
解决办法
3067
查看次数

python存储从stdin直接到列表对象的行

在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())它最终会使每个字符成为列表中的单独项目,而不是按照我想要的方式解析文本.无论如何..回到搜索.(谢谢阅读.)

python

1
推荐指数
1
解决办法
1273
查看次数

标签 统计

python ×2

bash ×1

gtk ×1

linux ×1

pygtk ×1

python-3.x ×1

ruamel.yaml ×1

shell ×1