相关疑难解决方法(0)

如何在Python中捕获SIGINT?

我正在开发一个启动多个进程和数据库连接的python脚本.我偶尔想用Ctrl+ C信号杀死脚本,我想做一些清理工作.

在Perl我会这样做:

$SIG{'INT'} = 'exit_gracefully';

sub exit_gracefully {
    print "Caught ^C \n";
    exit (0);
}
Run Code Online (Sandbox Code Playgroud)

我如何在Python中模拟这个?

python controls signals

504
推荐指数
9
解决办法
37万
查看次数

你能像往常一样制作python子进程输出stdout和stderr,还能将输出捕获为字符串吗?

可能重复:
包装子进程'stdout/stderr

这个问题中,hanan-n询问是否可以将python子进程输出到stdout,同时还将输出保存在字符串中以便以后处理.在这种情况下,解决方案是遍历每个输出行并手动打印它们:

output = []
p = subprocess.Popen(["the", "command"], stdout=subprocess.PIPE)
for line in iter(p.stdout.readline, ''):
    print(line)
    output.append(line)
Run Code Online (Sandbox Code Playgroud)

但是,此解决方案并未概括为您要为stdout和stderr执行此操作的情况,同时满足以下条件:

  • stdout/stderr的输出应分别转到父进程'stdout/stderr
  • 输出应该尽可能实时完成(但我最后只需要访问字符串)
  • stdout和stderr行之间的顺序不应该改变(我不太确定如果子进程以不同的时间间隔刷新它的stdout和stderr缓存,那怎么会工作;我们现在假设我们得到的所有东西都是包含完整的好块行?)

我查看了子进程文档,但找不到任何可以实现此目的的东西.我能找到的最接近的是添加stderr=subprocess.stdout和使用与上面相同的解决方案,但是我们失去了常规输出和错误之间的区别.有任何想法吗?我猜测解决方案 - 如果有的话 - 将涉及异步读取p.stdoutp.stderr.

这是我想做的一个例子:

p = subprocess.Popen(["the", "command"])
p.wait()  # while p runs, the command's stdout and stderr should behave as usual
p_stdout = p.stdout.read()  # unfortunately, this will return '' unless you use subprocess.PIPE
p_stderr = p.stderr.read()  # ditto
[do something …
Run Code Online (Sandbox Code Playgroud)

python subprocess

30
推荐指数
2
解决办法
3万
查看次数

将子进程输出显示到stdout并重定向它

我正在通过Python的子进程模块运行脚本.目前我使用:

p = subprocess.Popen('/path/to/script', stdout=subprocess.PIPE, stderr=subprocess.PIPE)
result = p.communicate()
Run Code Online (Sandbox Code Playgroud)

然后我将结果打印到stdout.这很好,但由于脚本需要很长时间才能完成,我还希望从脚本到stdout的实时输出.我输出输出的原因是因为我想解析它.

python subprocess stdout

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

标签 统计

python ×3

subprocess ×2

controls ×1

signals ×1

stdout ×1