小编fra*_*ans的帖子

从异常中获取漂亮字符串的正确方法

我要生成从一个行字符串Exception,它告诉我什么,其中(并不需要一个完整的回溯).以下信息会很好:

  • 文件名/亚麻
  • 异常类型
  • 异常描述(你得到什么str(e))
  • 很高兴:函数/方法/类

目前我做以下事情:

import os
...
try:
    os.nonexisting()
except Exception as e:
    t = e.__traceback__
    tbf = e.__traceback__.tb_frame
    print('%s:%d: %s in %s(): "%s" ' %
        os.path.basename(tbf.f_code.co_filename),
        t.tb_lineno,
        e.__class__.__name__,
        tbf.f_code.co_name, e))
Run Code Online (Sandbox Code Playgroud)

这给了我:

foo.py:203: AttributeError in foo(): "'module' object has no attribute 'nonexisting'"
Run Code Online (Sandbox Code Playgroud)

是否有更优雅的方式来打印出此示例中给出的详细信息?我正在考虑s.th. 喜欢

print(e.format('%f: %l: %t %F: "%w"'))
Run Code Online (Sandbox Code Playgroud)

我想避免导入额外的模块,除非有一个完全用于此目的.

python formatting exception python-3.x

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

是否可以从ZeroMQ PUB套接字获取过滤器列表?

正如在PUB/SUB场景中的zeromq版本3.x 中的文档中所述,消息在发布者侧被过滤(而不是在订阅者侧,这是微不足道的).

对我而言,这听起来像发布者必须保存所有连接的套接字和消息过滤器的列表才能实现此目的.

你同意吗?

基于这个假设,我现在想知道特定过滤器是否有效.当我知道它还没有被使用时,这将使我无法从某些(可能是非常慢的)其他数据提供者检索特定数据.

有没有办法在最新版本的ZeroMQ中查看给定PUB套接字上哪些过滤器处于活动状态?

我知道已经有了一些工作,看到这里,但现在已经两年了..

publish-subscribe zeromq

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

设置用于在CMake中构建的链接器搜索路径

似乎以前经常有人问过这个问题,但是在我的情况下似乎没有一种解决方案适用。

我在CMake / Linux环境中,必须在构建步骤中运行可执行二进制文件(protoc尤其是)。

该二进制文件需要一个库,但未将其安装(也不能安装在)的标准目录中/usr,因此找不到该库。

不幸的是,我无法操纵该protoc呼叫,因为该呼叫已嵌入第3方脚本中。

现在,我可以LD_LIBRARY_PATH在所有设置之前make设置它,也可以在整个系统上设置它,但这非常不便,特别是在涉及进行构建的IDE或具有连续构建环境的分布式构建方案时。

我试图设置LD_LIBRARY_PATH通过

set(ENV{LD_LIBRARY_PATH} "/path/to/library/dir")
Run Code Online (Sandbox Code Playgroud)

但这似乎在构建步骤中无效。

所以我的问题是:我可以在CMake中设置在构建期间使用的库搜索路径吗?

linux linker executable cmake

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

将 yaml-cpp 添加到现有项目时正确设置 CMake 变量

我已将yaml-cppgit 存储库添加为子模块,并使用add_subdirectory.

一切都很好,但我必须设置YAML_CPP_INCLUDE_DIRYAML_CPP_LIBRARIES手动将它们用于我自己的目标。

因为有一个文件yaml-cpp-config.cmake(在 build 文件夹中生成)设置了这些变量,所以我试图只包含它:

include("${CMAKE_BINARY_DIR}/yaml-cpp/yaml-cpp-config.cmake")
Run Code Online (Sandbox Code Playgroud)

但后来我得到:

CMake Error at /bla/bla/build/yaml-cpp/yaml-cpp-config.cmake:11 (include):
  The file

/bla/bla/aml-cpp/yaml-cpp-targets.cmake

  was generated by the export() command.  It may not be used as the argument
  to the include() command.  Use ALIAS targets instead to refer to targets by
  alternative names.
Run Code Online (Sandbox Code Playgroud)

我真的不明白这个消息。如何在yaml-cpp不设置硬编码变量的情况下为我的目标提供包含目录和库?

我不是在寻找一种方法来正确地保存 include()文件,以防它不必完成。我只是有兴趣我怎么应该提供给我的目标所需的信息。

不幸的是,yaml-cpp似乎没有使用target_include_directories()which 会在需要的地方自动设置包含目录。

c++ cmake yaml-cpp

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

Qt5内存泄漏?如何删除QMimeData?

我刚刚为这个问题提供了一个答案,并希望提供一个工作示例,当我发现QMimeData返回的新创建的实例QListModel::mimeData()在应用程序终止之前不会被删除.

所以这不是一个真正的内存泄漏,因为Qt处理QMimeData关闭时的所有实例,但你只需要拖放足够长的时间并将正确的内容放入你的mime数据中以让内存运行满.

我错过了什么?有没有办法告诉Qt QMimeData一旦不再需要它们就立即删除它们?

请注意:

我知道QMimeDataQt会在程序终止时自动删除每个实例.我在这里的问题不是所报告的真实内存泄漏valgrindcppcheck但它看起来像多和潜在的非常大的QMimeData情况下,获得在运行时不会吹灭了内存消耗和清理.

示例代码:

#include <QtWidgets>
#include <iostream>

struct TrackedMimeData : public QMimeData {
   TrackedMimeData(const QString & text) {
      std::cout << this << std::endl;
      setText(text);
   }
   ~TrackedMimeData() {
       std::cout << "~" << this << std::endl;
   }
};

struct MyListWidget : QListWidget {
   MyListWidget() {
      setDragEnabled(true);
      addItem("item1");
      addItem("item2");
   }
   QMimeData * mimeData(const QList<QListWidgetItem *>) const override {
      return new …
Run Code Online (Sandbox Code Playgroud)

c++ qt memory-leaks ownership

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

git:显示所有已修改的文件-已暂存和未暂存

我需要一个命令,该命令可以在脚本中使用的简单列表中为我提供所有已修改的文件 -包括暂存(即新添加的文件)和未暂存的更改。虽然这个问题听起来很熟悉,但我只能找到与我想做的事情接近的命令:

git ls-files -m
Run Code Online (Sandbox Code Playgroud)

..列出(非暂存)修改,但忽略暂存和新添加的文件

git diff --name-only
Run Code Online (Sandbox Code Playgroud)

..也只会列出非分阶段的修改

git diff --name-only --cached
Run Code Online (Sandbox Code Playgroud)

.. 列出分段修改,但忽略具有非分段修改的文件

git status --porcelain --untracked-files=no
Run Code Online (Sandbox Code Playgroud)

..输出我想查看的所有文件,但添加状态

git status当然可以使用cut第一个条目,但是由于我想将此命令集成到CMake脚本中,该脚本也将在Windows上使用。所以一个命令就可以了。

git

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

避免 pylints 宽泛的通用方法?

PEP8 不喜欢广泛的异常处理,如

try:
    do_something()
except Exception:
    handle_exception()
Run Code Online (Sandbox Code Playgroud)

我知道,有很好的理由像SystemExit以及KeyboardInterrupt在未inteded方式或丢失重要错误的情况下被处理。

但有时我认为我必须处理“所有其他”异常,例如在这种情况下:

while True:
    try:
        result = handle_request(get_request())
    except (all, my, known, exceptions) as ex:
        sophisticated_exception_handling()
    except (KeyboardInterrupt, SystemExit):
        raise
    except Exception as ex:
        # handle exotic situations which just didn't happen before
        result = "something bad happened: %r" % ex
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我不想让我的消息循环被中断,因为某些子例程引发了一个我还没有考虑过的异常。

当然,我可以只用# pylint: disable这条线来不发出警告 - 但这并不是最复杂的答案。

所以我的问题是:

是否有一些很酷的方法可以很好地处理所有异常,从而在不忽略 PEP8 警告的情况下永远不会脱离我的消息处理循环?

python exception-handling exception pep8

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

在 PyQt5 中,如何使用拖放正确移动 QTableView 中的行

我(只是)希望能够使用QTableView拖放机制来移动现有行。我找到了很多资源(例如,这里这里这里),它们描述了拖放,插入等的某些方面,但我仍在努力使其适合我的情况。

这是我正在寻找的解决方案应该具备的功能:

  • 处理“Qt-free”数据结构,例如元组列表。
  • 对数据结构进行操作。即,当视图中的项目顺序被修改时,应该在数据结构中修改它
  • 标准拖放启用列表的外观和感觉:
    • 选择/移动整行
    • 显示整条线的下降指示器
  • 诸如删除/编辑单元格之类的进一步操作仍然必须是可能的,即不会被拖放方法所触及

本教程展示了一个非常接近我需要的解决方案,但它使用了一个QStandardItemModel而不是QAbstractTableModel对我来说看起来半优化的解决方案,因为我必须基于(我是对的吗?)QStandardItem需要的“镜像”数据结构进行操作。QStandardItemModel

下面附加了代表我当前进度的代码。

目前我看到两种可能的方法:

方法 1:实现QAbstractTableModel并实现所有需要的事件/槽以修改底层数据结构: * 优点:最通用的方法 * 优点:没有冗余数据 * 缺点:我不知道如何获知已完成的拖放操作以及什么索引移到了哪里

在我附加的代码中,我跟踪了我所知道的所有相关方法并打印出所有参数。这是将第 2 行拖到第 3 行时得到的结果

dropMimeData(data: ['application/x-qabstractitemmodeldatalist'], action: 2, row: -1, col: -1, parent: '(row: 2, column: 0, valid: True)')
insertRows(row=-1, count=1, parent=(row: 2, column: 0, valid: True))
setData(index=(row: 0, column: 0, valid: True), value='^line1', role=0)
setData(index=(row: 0, column: …
Run Code Online (Sandbox Code Playgroud)

drag-and-drop pyqt qtableview python-3.x

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

PyTest:如何使最有可能失败的测试首先运行?

在我正在处理的项目中的数千个测试用例中,有(大约 10 个)测试很可能会失败(因为它们测试的东西很容易被破坏)。为了使测试快速失败,我想让它们先运行。

我知道--failed-first排序插件- 两者都有帮助,但不完全满足我的要求:我希望 pytest 能够了解过去失败的所有测试 - 不仅在最后一次运行中,而且如果能够让 pytest 发现这些情况(而不是手动指定它们。

那么有没有一种方法可以实现--failed-most-often-in-the-past呢?

你怎么做到这一点?

目前的方法

通过手动收集失败的测试,您可以先运行它们,只需将它们放在要运行的测试前面即可:

time pytest -x tests/some/generic/test_file.py::failing_test tests
Run Code Online (Sandbox Code Playgroud)

time (pytest -x tests/some/generic/test_file.py::failing_test; pytest -x tests)
Run Code Online (Sandbox Code Playgroud)

您现在可以自动收集失败的测试并将它们添加到文件中:

pytest -x $(cat failing_tests.txt) tests
Run Code Online (Sandbox Code Playgroud)

python pytest

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

bash: `set -e` 在 if 表达式中使用时不起作用?

看看这个小脚本:

#!/bin/bash

function do_something() {(
    set -e

    mkdir "/opt/some_folder"                                     # <== returns 1 -> abort?
    echo "mkdir returned $?"                                     # <== sets $0 to 0 again

    rsync $( readlink -f "${BASH_SOURCE[0]}" ) /opt/some_folder/ # <== returns 23 -> abort?
    echo "rsync returned $?"                                     # <== sets $0 to 0 again
)}


# here  every command inside `do_something` will be executed - regardless of errors
echo "run do_something in if-context.."
if ! do_something ; then
  echo "running do_something did not work" …
Run Code Online (Sandbox Code Playgroud)

bash if-statement subshell

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