小编Bru*_*ams的帖子

使用python argparse模块首先报告无效选项(或使用正则表达式)

在Python中使用argparse模块时,我正在寻找一种方法来捕获无效选项并更好地报告它们.https://docs.python.org/3/library/argparse.html#invalid-arguments上的文档提供了一个示例:

parser = argparse.ArgumentParser(prog='PROG'
parser.add_argument('--foo', type=int)
parser.add_argument('bar', nargs='?')

# invalid option
parser.parse_args(['--bar'])
usage: PROG [-h] [--foo FOO] [bar]
PROG: error: no such option: --bar
Run Code Online (Sandbox Code Playgroud)

然而,由于不首先报告错误的选项,所以很容易将其绊倒.例如:

import argparse
import datetime

def convertIsoTime(timestamp):
    """read ISO-8601 time-stamp using the AMS conventional format YYYY-MM-DDThh:mm:ssUTC"""
    try:
        return datetime.datetime.strptime(timestamp,"%Y-%m-%dT%H:%M:%SUTC")
    except:
        raise argparse.ArgumentTypeError("'{}' is not a valid ISO-8601 time-stamp".format(timestamp))

parser = argparse.ArgumentParser()
parser.add_argument('startTime', type=convertIsoTime)
parser.add_argument('--good', type=int,
                    help='foo')

args = parser.parse_args(['--gold','5','2015-01-01T00:00:00UTC'])
Run Code Online (Sandbox Code Playgroud)

将报告:

error: argument startTime: '5' is not a valid ISO-8601 time-stamp
Run Code Online (Sandbox Code Playgroud)

当我希望它报告更有用时:

error: no such …
Run Code Online (Sandbox Code Playgroud)

python argparse

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

如何在目标平台上探测系统版gcc使用的C++ ABI

我有一个配置探针,它根据平台和版本确定要传递给g ++的标志.我通常使用更高版本的gcc而不是本机安装版本,以便获得对C++ 14功能的访问.在较旧的平台上,这意味着我需要添加-D_GLIBCXX_USE_CXX11_ABI = 0以使用旧的C++ ABI,或者我无法与主机版本的C++库链接.然而,一些较新的平台确实使用新的ABI,在这种情况下需要-D_GLIBCXX_USE_CXX11_ABI = 1(或根本没有).

我可以根据目标平台的版本(即lsb_release -a的输出)来做到这一点,但我想要一个更通用的方法.

我认为我已经用原生编译器编译了一个C++ hello world程序(与我后来的编译器相反),但我无法弄清楚如何探测ABI版本.例如

>strings hello | grep ABI
.note.ABI-tag
>strings hello | grep CXX
GLIBCXX_3.4

或类似地使用hello探针程序使用的libstdc ++版本.

ldd ./hello | grep stdc++ | sed -e 's_.* /_/_' | cut -f 1 -d' ' |xargs strings | grep 

有没有人有更好的建议?

更新: 事实上我根本不需要这样做.我真正的问题是我有一个较旧版本的libstdc ++.所以闲逛.编译选择了一个版本6.0.20,运行时选择了一个不兼容的6.0.19(反之亦然).我有一个未解决的符号,我错误地将其归咎于ABI版本.与流行的看法相反,libstdc ++的次要版本并不总是二进制兼容.我的目的是始终在运行和编译时使用完全相同的版本(如果不使用主机本机版本).

c++ linux gcc configure c++14

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

cmake:如何将目标从子目录导入到更高级别?

给定一个递归构建结构。如何将目标从较低级别导入到较高级别?这是一个简化的示例:

顶级CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
add_subdirectory(sub1)
Run Code Online (Sandbox Code Playgroud)

sub1/CMakeLists.txt

add_subdirectory(subdir)
add_executable(foo EXCLUDE_FROM_ALL
  foo.cpp)

add_custom_target(both)
add_dependencies(both DEPENDS foo bar)
Run Code Online (Sandbox Code Playgroud)

sub1/subdir/CMakeLists.txt

add_executable(bar EXCLUDE_FROM_ALL
  bar.cpp)
Run Code Online (Sandbox Code Playgroud)

在顶层,所有目标都是可见的:

  • make foo - 构建 foo
  • 制作酒吧 - 建造酒吧
  • make both - 建立 foo & bar

在底层(sub1/subdir)只有是可见的:

  • 制作酒吧 - 建造酒吧

在中间层,只有foo作为目标可见:

  • make foo - 构建 foo
  • make both - 建立 foo & bar

制作帮助显示:

以下是此 Makefile 的一些有效目标:
...全部(如果未提供目标,则为默认值)
... 干净的
... 依靠
... edit_cache
...重建缓存
... 两个都
... foo
... foo.o
... …

cmake

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

Go 中语义注释有什么用?

通过与这个关于标签的问题进行类比,我注意到评论的多种用途超出了纯粹的评论。

例子:

还有其他我错过的吗?

有没有明确的清单?

一些第三方软件包(例如gocontractsgo-swagger)也使用它们。他们怎样才能避免彼此冲突呢?

go

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

ISO-8601是否允许时区缩写UTC而不是Z作为时区?

在我工作的几个项目中,我们已经使用过

YYYY-MM-DDTHH:MM:ssUTC

例如

2017-01-01T12:00:00UTC

作为时间格式并声称它(错误?)是ISO-8601的兼容子集.

很明显,ISO-8601包括Z并且+hhmm作为指定与UTC的偏移量的合法方式,从而指定时区(忽略夏令时).

很明显,W3C和采用(子集)ISO-8601的大多数其他组织更喜欢使用Z(和+hhmm).

我正在寻找熟悉或更好地拥有ISO-8601副本的人来确认它是否符合使用任何时区缩写和特别是UTC(作为zulu-time'Z'的同义词) ).

我认为IANA负责时区,而ISO-8601仅使用抵消来避免不得不处理时区变化问题.

我在这里找到了标准的旧版本,但未提及时区缩写.我想确认它在当前标准(ISO-8601:2004?)中无效使用UTC并声称符合ISO-8601标准.

timezone datetime iso datetime-format

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

使用 clang-tidy 和compile-commands.json 来解析多个文件

我无法让 clang-tidy 读取我的编译数据库。如果我尝试:

clang-tidy --config-file ./.clang-tidy -checks=* -p ./target
Run Code Online (Sandbox Code Playgroud)

或者

clang-tidy --config-file ./.clang-tidy -checks=* -p ./target/compile-commands.json
Run Code Online (Sandbox Code Playgroud)

我明白了

Error: no input files specified.
USAGE: clang-tidy [options] <source0> [... <sourceN>]
...
Run Code Online (Sandbox Code Playgroud)

但根据 --help -p 的方式来指定它的路径。它似乎只有在我指定单个文件时才有效,如下所示:

clang-tidy --config-file ./.clang-tidy -checks=* path/to/file.cpp
Run Code Online (Sandbox Code Playgroud)

clang-tidy

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

在 CentOS 7 上安装 docker-ce 时 moby 包的问题

我有一个 CentOS 7 的 docker 镜像,它通过推荐的说明安装了 docker-ce 。IE

RUN yum-config-manager \
  --add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
RUN yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
RUN yum update -y
RUN yum install -y docker-ce docker-ce-cli containerd.io
Run Code Online (Sandbox Code Playgroud)

最近这停止工作,现在失败如下:

--> Processing Conflict: moby-containerd-1.3.6+azure-1.x86_64 conflicts containerd
--> Processing Conflict: moby-runc-1.0.0~rc10+azure-2.x86_64 conflicts runc
--> Finished Dependency Resolution
Error: moby-containerd conflicts with containerd.io-1.2.13-3.2.el7.x86_64
Error: moby-runc conflicts with containerd.io-1.2.13-3.2.el7.x86_64
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles …
Run Code Online (Sandbox Code Playgroud)

azure docker centos7 moby

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

你可以用 pty 做什么?

阅读了包括http://www.linusakesson.net/programming/tty/在内的各种资源后, 我仍然对伪终端的结构和使用感到困惑和好奇在 linux 终端(bash 不是 tty)中,我们有三个流:

  • 标准输入
  • 标准输出
  • 标准错误

每个都有一个文件描述符。这些文件描述符映射到流 FILE*。例如,我们可以使用 fileno() 和 fdopen() 在它们之间进行切换。

我可以用 pty 做什么?

我通常认为 stdout、stdin 和 stderr 与进程相关联。我认为说有一个与 pty 相关联的 stdout、stdin 和 stderr 是不正确的。那么给定一个 pty(对于像 bash 这样的进程而不是它的 pid),你如何获得它们并将它们连接到 bash 意义上的终端?

单个文件描述符(对于 pty)如何映射到三个流?(显然它没有)它可以以某种方式映射到进程吗?

在使用 openpty() 时,我认为要连接主终端和从终端上的进程,您需要为 stdin、stdout 和 stderr 设置单独的管道,并有一个选择循环连接它们并在它们之间传输数据。

但是,您是否可以假设 stdin 和 stdout 已连接(通过 tty)并仅设置一个 stderr 管道以避免合并 stdout 和 stderr?

如果我们有一个 master 和 slave 进程,“额外”的 tty 实际上为我们做什么?


以下是我认为我知道并且相关的一些事情:

所述openpty()函数返回一对表示的伪终端的主设备和从设备的端部的文件描述符。

每个文件描述符指向字符设备 - 见https://man7.org/linux/man-pages/man7/pty.7.html

现在 Unix 中的设备只是特殊文件,因此文件描述符是有意义的。

bash 终端具有三个流,但 tty …

c linux tty pty

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

避免 labstack/echo 路由中的全局变量

我正在使用labstack/echo webserver 和gofight进行单元测试。在学习 go 时,go 想知道是否有 go 成语用于访问(嵌入式) echo 结构之外的状态。例如:

type WebPlusDB struct {
    web *echo.Echo
    db  *databaseInterface
}

func NewEngine() *echo.Echo {
    e := echo.New()
    e.GET("/hello", route_hello)
    return e    
}

func NewWebPlusDb() {
    e := NewEngine()
    db := database.New()   
    return WebPlusDB{e,db}
}

// for use in unit tests
func NewFakeEngine() *WebPlusDB {
    e := NewEngine()
    db := fakeDatabase.New()   
    return WebPlusDB{e,db}
}    

func route_hello(c echo.Context) error {
    log.Printf("Hello world\n")

    // how do I access WebPlusDB.db from here? …
Run Code Online (Sandbox Code Playgroud)

go go-echo

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

如何跳过失败的测试

在 Go 中,你可以跳过已经失败的测试吗?

语境:

我有一个heisenbug,目前无法确定其原因。它有时会导致某些测试失败。通过检查各种日志,我可以识别故障模式。我想做这样的事情:

if t.Failed() {
    if strings.Contains(string(suite.Stdout), "connection reset by peer") {
        t.Skip("Skip Test failed ")
    }
}
Run Code Online (Sandbox Code Playgroud)

这些测试非常有价值,尽管有 heisenbug,我还是想在 CI 中运行它们,所以这只是一个临时的解决方法。

这是行不通的。如果测试失败,是否有办法追溯跳过测试?

go go-testing

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

标签 统计

go ×3

linux ×2

argparse ×1

azure ×1

c ×1

c++ ×1

c++14 ×1

centos7 ×1

clang-tidy ×1

cmake ×1

configure ×1

datetime ×1

datetime-format ×1

docker ×1

gcc ×1

go-echo ×1

go-testing ×1

iso ×1

moby ×1

pty ×1

python ×1

timezone ×1

tty ×1