小编rob*_*ert的帖子

Python:如何防止子进程接收CTRL-C/Control-C/SIGINT

我目前正在为shell中运行的专用服务器开发包装器.包装器通过子进程生成服务器进程,并观察并响应其输出.

必须明确地为专用服务器提供一个命令才能正常关闭.因此,CTRL-C不得访问服务器进程.

如果我捕获KeyboardInterrupt异常或覆盖python中的SIGINT处理程序,服务器进程仍然会收到CTRL-C并立即停止.

所以我的问题是:如何防止子进程接收CTRL-C/Control-C/SIGINT?

python subprocess signals sigint keyboardinterrupt

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

Python:NameError:在封闭范围中赋值之前引用的自由变量're'

我在Python 3.3.1(win7)中有一个奇怪的NameError.

代码:

import re

# ...

# Parse exclude patterns.
excluded_regexps = set(re.compile(regexp) for regexp in options.exclude_pattern)

# This is line 561:
excluded_regexps |= set(re.compile(regexp, re.I) for regexp in options.exclude_pattern_ci)
Run Code Online (Sandbox Code Playgroud)

错误:

Traceback (most recent call last):
  File "py3createtorrent.py", line 794, in <module>
    sys.exit(main(sys.argv))
  File "py3createtorrent.py", line 561, in main
    excluded_regexps |= set(re.compile(regexp, re.I) for regexp in options.exclude_pattern_ci)
  File "py3createtorrent.py", line 561, in <genexpr>
    excluded_regexps |= set(re.compile(regexp, re.I) for regexp in options.exclude_pattern_ci)
NameError: free variable 're' referenced before assignment in …
Run Code Online (Sandbox Code Playgroud)

python

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

clang-format在if()while()for()之后添加{}语句

我想知道,如果铛格式可以设置,以减少非compound_statement{ non-compound_statement; }iteration_statement.

statement
: labeled_statement
| compound_statement
| expression_statement
| selection_statement
| iteration_statement
| jump_statement
;
iteration_statement
: WHILE '(' expression ')' statement
| DO statement WHILE '(' expression ')' ';'
| FOR '(' expression_statement expression_statement ')' statement
| FOR '(' expression_statement expression_statement expression ')' statement
;
Run Code Online (Sandbox Code Playgroud)

输入:

if (exp) foo = 1;
Run Code Online (Sandbox Code Playgroud)

输出:

if (exp) { foo = 1; }
Run Code Online (Sandbox Code Playgroud)

然后美化师会根据需要缩进.

clang-format

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

C++ Lambda分段错误

以下代码产生分段错误,我不知道为什么:

    myTree<int> tree;
    tree.insert(10); // not important

    std::vector<int> v = tree.toVector(); // Segmentation fault
Run Code Online (Sandbox Code Playgroud)

这是myTree代码(减少,不可编译,只是足以理解它是什么):

template<class T> struct node {
    T key;
    node *left;
    node *right;
    int count;

    node(const T &k=T(), node *l=0, node *r=0) {
        key = k;
        left = l;
        right = r;
        count = 1;
    }
};

template<class T> class myTree {
public:
    myTree() {
        root = 0;
    }

    void traverseInOrder(void (*visitFunc)(node<T>* n)) {
        traverseInOrder(visitFunc, root);
    }

    std::vector<T> toVector() {
        std::vector<T> v;
        traverseInOrder([&](node<T>* n) {
            v.insert(v.end(), n->count, …
Run Code Online (Sandbox Code Playgroud)

c++ lambda function-pointers reference capture

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

ACTION_IMAGE_CAPTURE 意图:避免 Activity 被破坏/进程被终止

这个问题是针对熟悉Activity Lifecycle 的Android 开发人员的。

我正在开发一个执行面部检测和面部标志识别的应用程序。

相应的机器学习模型需要很长时间才能从 SD 存储中解析并加载到内存中。在当前的平均 Android 设备上,很容易需要长达 20 秒的时间。顺便说一句,所有这些面部分析内容和模型加载都发生在 C++ 本机代码中,并使用 Android NDK + JNI 进行集成。

由于模型加载需要很长时间,因此实际的解析和加载是通过 AsyncTasks 提前安排在后台的,因此用户不会注意到巨大的延迟。

在执行实际的人脸分析之前,用户可以通过 MediaStore.ACTION_IMAGE_CAPTURE 进行自拍。这将调用设备上安装的单独相机应用程序并通过 onActivityResult 接收图片。

现在问题开始了:当用户位于单独的相机活动/应用程序中时,几乎总是整个应用程序进程都会被终止。大多数情况下,它似乎发生在从相机应用程序返回之前(时间似乎很奇怪)。我做了另一个测试,以确认在相机应用程序内按下拍摄按钮时会发生这种情况。在那一刻,我的应用程序被杀死了。当按下“接受图像”按钮时,将重新创建应用程序。ActivityManager 在 logcat 中给出的进程终止原因是“prev LAST”(我通过 Google 没有找到任何关于此含义的信息,但我看到许多其他应用程序也因这个原因被终止,所以它似乎发生了经常)。

因此,我的应用程序的所有 Activity 都需要由 Android 重新创建(对我来说很好,因为它发生得很快),而且面部分析模型也必须从头开始重新加载,用户会注意到在自拍之前有巨大的延迟可以进行处理。

我的问题是:是否有可能告诉Android,活动/应用程序有合法的理由在暂时处于后台获取相机图片时不被杀死?毕竟,ActivityManager 做出了终止应用程序的错误决定。如此频繁地重新加载模型会占用大量的 CPU 和内存资源。

这似乎是 Android 生命周期架构中的一个疏忽。我知道很少有应用程序有我的应用程序的特定要求,但它仍然看起来很愚蠢。我能想到的“解决”这个问题的唯一方法是在应用程序中实现我自己的相机 Activity,但这违背了 Android 自己的最佳实践。

还有一些“android:persistent”标志,您可以通过 AndroidManifest.xml 坚持您的 Activity,但文档完全不清楚其含义。请参阅有关此的文档。

顺便说一句:当应用程序进程被杀死时,onDestroy 不会被调用。我在某处读到不能保证 onDestroy 会被调用,这对我来说实际上不是问题。虽然我想知道为什么 Android 文档没有明确说明这一点。

android android-ndk application-lifecycle activity-lifecycle android-camera-intent

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