小编jas*_*m76的帖子

Python失去了对子进程的控制?

我正在使用一个商业应用程序,它使用Python作为其脚本API的一部分.提供的功能之一是所谓的App.run().调用此函数时,它会启动一个执行其余执行的新Java进程.(不幸的是,由于提供的Python模块是.pyc文件,我真的不知道它在幕后做了什么,而且许多Python函数都是SWIG生成的).

我遇到的麻烦是我正在将App.run()调用构建到一个更大的Python应用程序中,该应用程序需要做一些有保证的清理代码(关闭数据库等).不幸的是,如果子进程被Ctrl+ 中断C,它将中止并返回到命令行而不将控制权返回给主Python程序.因此,我的清理代码永远不会执行.

到目前为止,我已经尝试过:

  1. 使用atexit注册函数...不起作用
  2. 将清理放在类__del__析构函数中......不起作用.(App.run()在课堂内)
  3. 在主Python应用程序中为Ctrl+ 创建信号处理C程序...不起作用
  4. App.run()一个主题...结果后的内存故障Ctrl+C
  5. App.run()一个过程(从多处理)...不起作用

有什么想法会发生什么?

python linux subprocess

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

基于像素的模式识别的数据结构

我有一个应用程序,根据约束构造随机图像.随机选择不同颜色的像素并将其放置在满足所有约束的网格中.例如(简化),可能存在一个约束,表示蓝色或绿色像素是(0,-1),红色像素是(-1,-1)和(-1,0),然后放置禁止使用白色像素.这些坐标是来自当前放置位置(即其邻域)的矢量.

现在我将约束存储在一个数组中并循环遍历它们,检查每个约束是否适用.我必须为我放置在网格中的每个像素执行此操作.因此,随着更多约束的增加,性能会受到影响.此外,两个约束可能存在冲突,但要检查它并不容易.

我认为图形类型数据结构(树?)可能是存储所有约束的一种方式,这样我就可以从像素邻域快速确定哪些(如果有的话)约束适用.但是我不知道如何使这样的结构起作用,因为单个坐标可以包含多种颜色,以及如何将一组坐标/颜色与一组禁止的像素颜色联系起来.有任何想法吗?

pattern-matching data-structures

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

生成约束组合的快速方法?

我有生成器函数,可以创建列表的笛卡尔积.真正的应用程序使用更复杂的对象,但它们可以用字符串表示:

import itertools

s1 = ['a', 'b']
s2 = ['c', 'd', 'e', 'f']
s3 = ['c', 'd', 'e', 'f']
s4 = ['g']

p = itertools.product(*[s1,s2,s3,s4])
names = [''.join(s) for s in p]
Run Code Online (Sandbox Code Playgroud)

在此示例中,结果是32个字符组合:

names
['accg', 'acdg', 'aceg', 'acfg', 'adcg', 'addg', 'adeg', 'adfg', 'aecg',
 'aedg', 'aeeg', 'aefg', 'afcg', 'afdg', 'afeg', 'affg', 'bccg', 'bcdg',
 'bceg', 'bcfg', 'bdcg', 'bddg', 'bdeg', 'bdfg', 'becg', 'bedg', 'beeg',
 'befg', 'bfcg', 'bfdg', 'bfeg', 'bffg']
Run Code Online (Sandbox Code Playgroud)

现在,假设我有一些限制,使某些字符组合是非法的.例如,假设只允许包含正则表达式'[ab] .c'的字符串.('a'或'b'后跟任何字母后跟'c')

应用这些约束后,我们只剩下8个字符串:

import re
r = re.compile('[ab].c')
filter(r.match, names)
['accg', 'adcg', 'aecg', 'afcg', …
Run Code Online (Sandbox Code Playgroud)

python algorithm combinatorics

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

具有惰性密钥生成的C++比较器函数

我想在C++中存储具有自定义比较器功能的对象std::map,例如:

std::map<Part, Inventory, PartCmp> 
Run Code Online (Sandbox Code Playgroud)

对于比较器,我想通过一个计算成本昂贵的"密钥"对对象进行排序,所以我想到了一种懒惰的评估方法.下面的例子有点微不足道,但说明了问题:

class Part {
public:
   std::string item_id;
   int color_id;
   int condition;
   std::string name;
   std::string category;

   std::string key();       
private:
   std::string key_;
}

std::string Part::key() {
    // Only create key value if it hasn't been done before
    if (key_.empty()) {
        ostringstream keystream;
        keystream << item_id << color_id << condition;
        key_ = keystream.str();
    }
    return key_;
}
Run Code Online (Sandbox Code Playgroud)

这意味着我的比较器看起来像:

struct PartCmp {
    bool operator() (Part& p1, Part& p2) const {
        return p1.key() < p2.key();
    }
};
Run Code Online (Sandbox Code Playgroud)

这与我见过的所有其他示例不同,p1 …

c++ stdmap

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