小编Dan*_*Dan的帖子

程序关闭期间在Python中捕获KeyboardInterrupt

我正在用Python编写命令行实用程序,因为它是生产代码,所以应该能够干净地关闭而不会将大量的东西(错误代码,堆栈跟踪等)转储到屏幕上.这意味着我需要捕获键盘中断.

我尝试过使用try catch块,如:

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print 'Interrupted'
        sys.exit(0)
Run Code Online (Sandbox Code Playgroud)

并捕捉信号本身(如在这篇文章中):

import signal
import sys

def sigint_handler(signal, frame):
    print 'Interrupted'
    sys.exit(0)
signal.signal(signal.SIGINT, sigint_handler)
Run Code Online (Sandbox Code Playgroud)

这两种方法在正常操作期间似乎都能很好地工作.但是,如果在应用程序结束时清理代码期间出现中断,Python似乎总是在屏幕上打印一些东西.捕获中断给出了

^CInterrupted
Exception KeyboardInterrupt in <bound method MyClass.__del__ of <path.to.MyClass object at 0x802852b90>> ignored
Run Code Online (Sandbox Code Playgroud)

而处理信号也给出了

^CInterrupted
Exception SystemExit: 0 in <Finalize object, dead> ignored
Run Code Online (Sandbox Code Playgroud)

要么

^CInterrupted
Exception SystemExit: 0 in <bound method MyClass.__del__ of <path.to.MyClass object at 0x802854a90>> ignored
Run Code Online (Sandbox Code Playgroud)

这些错误不仅难看,而且对于没有源代码的最终用户来说也不是很有帮助!

此应用程序的清理代码相当大,因此真正的用户可能会遇到此问题.有没有办法捕获或阻止此输出,或者它只是我必须处理的东西?

python keyboardinterrupt

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

OpenCV错误:该函数未实现

我正在尝试让OpenCV在我的Ubuntu机器上使用Python.我已经下载并安装了OpenCV,但是当我尝试运行以下python代码时(应该从网络摄像头捕获图像并将它们推送到屏幕)

import cv

cv.NamedWindow("w1", cv.CV_WINDOW_AUTOSIZE)
capture = cv.CaptureFromCAM(0)

def repeat():
    frame = cv.QueryFrame(capture)
    cv.ShowImage("w1", frame)
    time.sleep(10)

while True:
    repeat()
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or
Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and
pkg-config, then re-run cmake or configure script
Run Code Online (Sandbox Code Playgroud)

所以我按照他们的要求做:安装软件包,移动到我安装OpenCV的文件夹,然后运行

sudo make uninstall
make
sudo make install
Run Code Online (Sandbox Code Playgroud)

但是当我尝试运行python时,它给了我同样的错误.我错过了什么吗?

python opencv

40
推荐指数
5
解决办法
8万
查看次数

C中的'memdup'功能?

在C中,您可以使用strdup简洁地分配缓冲区并将字符串复制到其中.然而,据我所知,一般记忆没有类似的功能.例如,我不能说

struct myStruct *foo = malloc(sizeof(struct myStruct));
fill_myStruct(foo);

struct myStruct *bar = memdup(foo, sizeof(struct myStruct));
// bar is now a reference to a new, appropriately sized block of memory,
//   the contents of which are the same as the contents of foo
Run Code Online (Sandbox Code Playgroud)

那么,我的问题有三个:

  1. 是否有一些我不知道的标准库函数?
  2. 如果没有,是否有一个简洁的,最好是标准的方法来做到这一点,没有明确的调用mallocmemcpy
  3. 为什么C包括strdup但不包括memdup

c strdup memcpy

13
推荐指数
3
解决办法
8739
查看次数

在C++中抛出异常后应该如何释放内存?

如果这个问题是重复的,我很抱歉 - 我搜索了一段时间,但是我的Google-fu可能不符合要求.

我正在修改一个调用C库的C++程序.C库分配一堆内存(使用malloc()),C++程序使用它然后释放它.问题是C++程序可以在执行过程中抛出异常,从而导致分配的内存永远不会被释放.

作为一个(相当做作的)例子:

/* old_library.c */
char *allocate_lots() {
    char *mem = (char *)malloc(1024);
    return mem;
}

/* my_prog.cpp */
void my_class::my_func () {
    char *mem = allocate_lots();
    bool problem = use(mem);
    if (problem)
        throw my_exception("Oh noes! This will be caught higher up");
    free(mem);  // Never gets called if problem is true
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:我应该怎么处理这个问题?我的第一个想法是将整个事物包装在一个try/catch块中,并且在catch中只需检查并释放内存并重新抛出异常,但这对我来说似乎没有优点和笨重(如果我不顺利的话)想要真正捕获异常).有没有更好的方法呢?

编辑:我可能应该提到我们正在使用g ++ 4.2.2,从2007年开始使用std :: unique_ptr之前.将它归结为企业惯性.

memory malloc exception c++03

6
推荐指数
2
解决办法
588
查看次数

如何从 DynamoDB 的 Golang SDK 序列化 `LastEvaluatedKey`?

在 Golang 中使用 DynamoDB 时,如果对 的调用query有更多结果,它将LastEvaluatedKey在 上设置QueryOutput,然后您可以将其传递到下一次调用 asqueryExclusiveStartKey从上次中断的位置继续。

当值保留在 Golang 中时,这非常有效。但是,我正在编写一个分页 API 端点,因此我想序列化此密钥,以便我可以将其作为分页令牌返回给客户端。像这样的东西,something做我想要的事情的神奇包在哪里:

type GetDomainObjectsResponse struct {
  Items     []MyDomainObject `json:"items"`
  NextToken string           `json:"next_token"`
}
  
func GetDomainObjects(w http.ResponseWriter, req *http.Request) {
  // ... parse query params, set up dynamoIn ...

  dynamoIn.ExclusiveStartKey = something.Decode(params.NextToken)

  dynamoOut, _ := db.Query(dynamoIn)

  response := GetDomainObjectsResponse{}
  dynamodbattribute.UnmarshalListOfMaps(dynamoOut.Items, &response.Items)

  response.NextToken := something.Encode(dynamoOut.LastEvaluatedKey)
  
  // ... marshal and write the response ...
}
Run Code Online (Sandbox Code Playgroud)

(请原谅上面的任何拼写错误,这是我为了隔离问题而快速编写的代码的玩具版本)

因为我需要支持具有不同搜索模式的多个端点,所以我希望有一种生成不依赖于特定搜索键的分页标记的方法。

问题是,我还没有找到一种干净且通用的方法来序列化LastEvaluatedKey. …

go amazon-dynamodb

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

Oracle SQL - 有一个标准的每个变通方法吗?

我无法找到解决Oracle缺乏对HAVING EVERY子句的支持的方法.

我有两个表,生产和电影,具有以下架构:

Production (pid, mid)
Movie(mid, director)
Run Code Online (Sandbox Code Playgroud)

其中'pid'是表示发布者ID的整数,'mid'是表示电影ID的整数,director是电影导演的名称.

我的目标是获得一份出版商名单(按ID),这些出版商只发行由Peter Jackson或Ben Affleck执导的电影.

为了实现这一点,我写了以下查询:

SELECT *
    FROM Production P, Movie M
    WHERE P.mid = M.mid;
    GROUP BY P.pid
    HAVING EVERY ( M.director IN ('Ben Affleck', 'Peter Jackson') );
Run Code Online (Sandbox Code Playgroud)

但由于Oracle不支持HAVING EVERY,所以我得到的是以下错误:

    HAVING EVERY ( M.director IN ('ben affleck', 'PJ') )
                          *
ERROR at line 5:
ORA-00907: missing right parenthesis
Run Code Online (Sandbox Code Playgroud)

由于董事职位必须适用于出版商制作的每部电影,我不相信条件可以转移到WHERE子句.

这条路障有什么办法吗?任何被认为是"标准"的东西?另外(也许更重要的是)为什么Oracle选择不实施HAVING EVERY?

sql oracle sqlplus having-clause

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

React 如何防止具有 value 属性的 &lt;input&gt; 发生更改?

受控形式是众所周知的反应主义。当value属性添加到<input>标记时,标记不再自行更改,并且必须通过事件处理程序进行state控制onChangevalue如果你设置时没有设置.React 甚至会给你一个友好的警告onChange

然而,在普通 HTML 中情况并非如此——<input>具有值集的元素是完全可写的。

在此 codepen 中可以看到行为上的对比。请注意,当您在只读框中键入内容时,组件不会重新渲染,这意味着该值不会冻结,因为 React 使用旧的静态值重新渲染。React 以某种方式阻止了 DOM 的默认行为。

这引出了三个问题:

  1. 为什么(从设计的角度来看)React 的行为与 DOM 本身不同?
  2. 这是通过什么机制发生的?
  3. 这种关于 DOM 行为方式的不同哲学是否出现在其他地方?

我假设 2 的答案涉及有关影子 DOM 和合成事件的内容,但我还没有找到关于它如何工作或为什么它具体改变行为的简明描述<input>

html reactjs

5
推荐指数
0
解决办法
518
查看次数