在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) 我有一个配置探针,它根据平台和版本确定要传递给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 ++的次要版本并不总是二进制兼容.我的目的是始终在运行和编译时使用完全相同的版本(如果不使用主机本机版本).
给定一个递归构建结构。如何将目标从较低级别导入到较高级别?这是一个简化的示例:
顶级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)
在顶层,所有目标都是可见的:
在底层(sub1/subdir)只有栏是可见的:
在中间层,只有foo作为目标可见:
制作帮助显示:
以下是此 Makefile 的一些有效目标: ...全部(如果未提供目标,则为默认值) ... 干净的 ... 依靠 ... edit_cache ...重建缓存 ... 两个都 ... foo ... foo.o ... …
通过与这个关于标签的问题进行类比,我注意到评论的多种用途超出了纯粹的评论。
例子:
还有其他我错过的吗?
有没有明确的清单?
一些第三方软件包(例如gocontracts和go-swagger)也使用它们。他们怎样才能避免彼此冲突呢?
在我工作的几个项目中,我们已经使用过
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标准.
我无法让 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) 我有一个 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) 阅读了包括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 …
我正在使用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 中,你可以跳过已经失败的测试吗?
语境:
我有一个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 中运行它们,所以这只是一个临时的解决方法。
这是行不通的。如果测试失败,是否有办法追溯跳过测试?