相关疑难解决方法(0)

如何优雅地处理SIGTERM信号?

让我们假设我们有一个用python编写的这样一个简单的守护进程:

def mainloop():
    while True:
        # 1. do
        # 2. some
        # 3. important
        # 4. job
        # 5. sleep

mainloop()
Run Code Online (Sandbox Code Playgroud)

然后我们使用start-stop-daemon默认的send SIGTERM(TERM)信号进行守护--stop.

我们假设当前执行的步骤是#2.在这个时刻,我们正在发送TERM信号.

会发生什么是执行立即终止.

我发现我可以处理信号事件,signal.signal(signal.SIGTERM, handler)但问题是它仍然会中断当前执行并将控制传递给handler.

所以,我的问题是-它可以不中断当前执行,但处理TERM(?)在独立的线程信号,使我能够设置shutdown_flag = True,使mainloop()有机会停止正常?

python daemon sigterm start-stop-daemon

177
推荐指数
6
解决办法
13万
查看次数

如何关闭python simpleHTTPserver?

所以我正在努力学习d3,wiki建议这样做

要在本地查看示例,您必须具有本地Web服务器.任何Web服务器都可以工作; 例如,您可以运行Python的内置服务器:

python -m SimpleHTTPServer 8888 &

很棒...只是现在我有一台服务器正在运行...但在某些时候我想我应该再次关闭它.

关闭它比使用更好的方法kill <pid>吗?对于一份小工作来说,这似乎是一件大事.

(我正在运行Mac OS 10.6.8(Snow Leopard))

FWIW:ctrl+c提供大约10行追溯,抱怨被打断.

kill -3 <pid> 在一个单独的窗口中发出一个Finder警告'Python意外退出'.

默认kill <pid>并且kill -15 <pid>相对干净(而且简单).

python simplehttpserver d3.js

61
推荐指数
6
解决办法
8万
查看次数

用Python捕获Control-C

我想知道是否可以通过以下方式在python中捕获Control-C:

 if input != contr-c:
    #DO THINGS
 else:
    #quit
Run Code Online (Sandbox Code Playgroud)

我已经阅读了有关的内容,但他们tryexcept KeyboardInterrupt没有为我工作.

python error-handling keyboard-events

29
推荐指数
2
解决办法
5万
查看次数

捕获`KeyboardInterrupt`而不关闭Python中的Selenium Webdriver会话

Python程序通过Selenium WebDriver驱动Firefox.代码嵌入在try/ exceptblock中,如下所示:

session = selenium.webdriver.Firefox(firefox_profile)
try:
    # do stuff
except (Exception, KeyboardInterrupt) as exception:
    logging.info("Caught exception.")
    traceback.print_exc(file=sys.stdout)
Run Code Online (Sandbox Code Playgroud)

如果程序因错误而中止,则WebDriver会话不会关闭,因此Firefox窗口保持打开状态.但是如果程序以KeyboardInterrupt异常中止,则Firefox窗口会关闭(我想因为WebDriver会话也被释放了),我想避免这种情况.

我知道两个异常都通过相同的处理程序,因为我"Caught exception"在两种情况下都看到了消息.

我怎么能避免关闭Firefox窗口KeyboardInterrupt

python keyboardinterrupt selenium-webdriver

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

Python:使用附加的输入和输出文件提供和解析与外部程序之间的数据流

问题: 我有一个设计糟糕的Fortran程序(我无法更改它,我坚持使用它)从stdin和其他输入文件中获取文本输入,并将文本输出结果写入stdout和其他输出文件.输入和输出的大小非常大,我想避免写入硬盘驱动器(慢速操作).我编写了一个函数,迭代几个输入文件的行,我也有多个输出的解析器.我真的不知道程序是否首先读取所有输入然后开始输出,或者在读取输入时开始输出.

目标: 拥有一个为外部程序提供所需功能的函数,并在输出来自程序时解析输出,而无需将数据写入硬盘驱动器上的文本文件.

研究: 使用文件的天真方式是:

from subprocess import PIPE, Popen

def execute_simple(cmd, stdin_iter, stdout_parser, input_files, output_files):

    for filename, file_iter in input_files.iteritems():
        with open(filename ,'w') as f:
            for line in file_iter:
                f.write(line + '\n')


    p_sub = Popen(
        shlex.split(cmd),
        stdin = PIPE,
        stdout = open('stdout.txt', 'w'),
        stderr = open('stderr.txt', 'w'),
        bufsize=1
    )
    for line in stdin_iter:
        p_sub.stdin.write(line + '\n')

    p_sub.stdin.close()
    p_sub.wait()

    data = {}
    for filename, parse_func in output_files.iteritems():
        # The stdout.txt and stderr.txt is included here
        with open(filename,'r') as f: …
Run Code Online (Sandbox Code Playgroud)

python legacy io asynchronous

16
推荐指数
2
解决办法
1660
查看次数

使用KeyboardInterrupt异常捕获SIGINT在终端中工作,而不是在脚本中

我试图SIGINT在Python 2.7程序中捕获(或键盘中断).这就是我的Python测试脚本的test外观:

#!/usr/bin/python

import time

try:
    time.sleep(100)
except KeyboardInterrupt:
    pass
except:
    print "error"
Run Code Online (Sandbox Code Playgroud)

接下来我有一个shell脚本test.sh:

./test & pid=$!
sleep 1
kill -s 2 $pid
Run Code Online (Sandbox Code Playgroud)

当我使用bash或sh或其他东西运行脚本时,bash test.shPython进程test保持运行并且无法使用SIGINT.而当我复制test.sh命令并将其粘贴到(bash)终端时,Python进程test将关闭.

我不知道发生了什么,我想了解.那么,差异在哪里,为什么?

这不是关于如何捕获SIGINTPython!根据文档 - 这是应该工作的方式:

Python默认安装少量信号处理程序:SIGPIPE ...和SIGINT转换为KeyboardInterrupt异常

这的确是追赶KeyboardInterruptSIGINT被发送kill,如果该程序是由外壳直接启动,但是当程序从后台运行bash脚本开始,似乎KeyboardInterrupt永远不会提高.

python bash shell sigint

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

允许Ctrl-C中断python C扩展

我在(自制的)基于C的python扩展中运行一些计算量很大的模拟.偶尔我会弄错,想终止模拟.但是,Ctrl-C似乎没有任何效果(除了打印^C到屏幕,所以我必须使用kill或系统监视器终止进程.

据我所知,python只是等待C扩展完成,并且在此期间并没有真正与它通信.

有没有办法让这项工作?

python linux python-c-api

12
推荐指数
3
解决办法
2560
查看次数

在cmd.Cmd命令行解释器中更好地处理KeyboardInterrupt

使用python的cmd.Cmd创建自定义CLI时,如何告诉处理程序中止当前行并给我一个新提示?

这是一个最小的例子:

# console_min.py
# run: 'python console_min.py'

import cmd, signal

class Console(cmd.Cmd):
    def __init__(self):
        cmd.Cmd.__init__(self)
        self.prompt = "[test] "
        signal.signal(signal.SIGINT, handler)

    def do_exit(self, args):
        return -1

    def do_EOF(self, args):
        return self.do_exit(args)

    def preloop(self):
        cmd.Cmd.preloop(self)
        self._hist    = []
        self._locals  = {}
        self._globals = {}

    def postloop(self):
        cmd.Cmd.postloop(self)
        print "Exiting ..."

    def precmd(self, line):
        self._hist += [ line.strip() ]
        return line

    def postcmd(self, stop, line):
        return stop

    def emptyline(self):
        return cmd.Cmd.emptyline(self)

    def handler(self, signum, frame):
        # self.emptyline() does not work here …
Run Code Online (Sandbox Code Playgroud)

python

11
推荐指数
2
解决办法
8582
查看次数

Python诅咒困境

我正在玩Python和诅咒.

我跑的时候

import time
import curses

def main():
    curses.initscr()
    curses.cbreak()
    for i in range(3):
        time.sleep(1)
        curses.flash()
        pass
    print( "Hello World" )
    curses.endwin()

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

如果我一直等待,curses.endwin()就会被调用,所以一切正常.但是,如果我用Ctrl-C剪短它,curses.endwin()永远不会被调用,所以它搞砸了我的终端会话.

处理这种情况的正确方法是什么?我怎样才能确保无论我如何尝试结束/中断程序(例如Ctrl-C,Ctrl-Z),它都不会弄乱终端?

python curses ncurses

10
推荐指数
2
解决办法
1万
查看次数

如何使用pycurl很好地处理KeyboardInterrupt(Ctrl-c)?

我正在编写一个Python脚本,pycurl用于使用Twitter的Sreaming API.这是一个简短的代码片段(只需将您的Twitter登录名/密码进行测试):

import pycurl

user = 'USER'
password = 'PWD'

def handleData(data):
    print(data)

conn = pycurl.Curl()  
conn.setopt(pycurl.USERPWD, "%s:%s" % (user, password))  
conn.setopt(pycurl.URL, 'https://stream.twitter.com/1/statuses/sample.json')  
conn.setopt(pycurl.WRITEFUNCTION, handleData)
conn.perform()
Run Code Online (Sandbox Code Playgroud)

问题是因为脚本使用流,所以conn.perform()永远不会返回(或很少).因此,我有时需要中断脚本,并且KeyboardInterruptperform()方法捕获.

但是,它不能很好地处理它,打印出一个丑陋的错误,并引发一个不同的异常.

^CTraceback (most recent call last):
  File "test.py", line 6, in handleData
    def handleData(data):
KeyboardInterrupt
Traceback (most recent call last):
  File "test.py", line 12, in <module>
    conn.perform()
pycurl.error: (23, 'Failed writing body (0 != 2203)')
Run Code Online (Sandbox Code Playgroud)

卷曲FAQ说,中断正在进行的转移,回调函数(在我的情况handleData),应返回的特殊值.这很棒,但是KeyboardInterrupt没有被任何回调功能捕获!

我怎么能整齐地做到这一点? …

python curl pycurl twitter-streaming-api

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