我正在使用一个科学软件,包括一个os.system()用于运行另一个科学程序的Python脚本.在子进程运行时,Python在某些时候打印以下内容:
close failed in file object destructor:
IOError: [Errno 9] Bad file descriptor
Run Code Online (Sandbox Code Playgroud)
我相信此消息会在os.system()返回的同时打印出来.
我现在的问题是:
哪种情况会导致这种类型的IOError?它究竟意味着什么?对于已被调用的子进程意味着什么os.system()?
我正在使用py.test并想知道是否/如何setup在运行每个测试之前检索在调用的方法中当前执行的测试的名称.考虑以下代码:
class TestSomething(object):
def setup(self):
test_name = ...
def teardown(self):
pass
def test_the_power(self):
assert "foo" != "bar"
def test_something_else(self):
assert True
Run Code Online (Sandbox Code Playgroud)
在TestSomething.test_the_power执行之前,我希望能够访问setup代码中概述的此名称,test_name = ...以便test_name== "TestSomething.test_the_power".
实际上,setup我为每个测试分配了一些资源.最后,看一下各种单元测试创建的资源,我希望能够看到哪一个是通过哪个测试创建的.最好的方法是在创建资源时使用测试名称.
我正在考虑为各种类型的数据创建一个开源数据管理Web应用程序.
特权用户必须能够
这些将是特权用户的常见任务.他将通过应用程序的Web界面执行此操作.最后,所有数据都必须可由应用程序的所有类型的用户进行搜索和排序.两个问题困扰我:
a)如何将数据存储在数据库中?我应该在运行时动态添加/删除数据库表和/或列吗?
我不是数据库专家.我坚持想象一下,在关系数据库方面,应用程序必须能够在运行时动态添加/删除表(实体)和/或列(属性).我不喜欢这个想法.同样,我在想是否应该在NoSQL数据库中处理这样的动态数据.
无论如何,我相信这种问题有一个智能的规范解决方案,到目前为止我还没有找到并想到这个解决方案.这种动态数据管理的最佳方法是什么?
b)如何使用ORM或NoSQL在Python中实现这一点?
如果您建议使用关系数据库模型,那么我想使用SQLAlchemy.但是,我没有看到如何在运行时使用ORM动态创建表/列.这是我希望在运行时创建表和列的方法更好的原因之一.使用SQLAlchemy可以高效地实现推荐的数据库模型吗?
如果你推荐使用NoSQL数据库,哪一个?我喜欢使用Redis - 您能想象基于Redis的高效实现吗?
谢谢你的建议!
编辑以回应一些评论:
这个想法是某个实体("表")的所有实例("行")共享同一组属性/属性("列").但是,如果某些实例的某些属性/属性具有空值,则它将完全有效.
基本上,用户将通过网站上的简单表单搜索数据.它们查询例如具有属性P的实体E的所有实例,其具有高于T的值V.结果可以按任何属性的值排序.
数据集不会变得太大.因此,我认为即使是最愚蠢的方法仍然会导致一个工作系统.但是,我是一个狂热爱好者,我想应用现代和适当的技术,以及我想知道理论上的瓶颈.我想使用这个项目来收集设计"Pythonic",最先进,可扩展,可靠的Web应用程序的经验.
我看到第一条评论倾向于推荐NoSQL方法.虽然我真的很喜欢Redis,但是看起来不利用Mongo/Couch的Document/Collection模型会很愚蠢.我一直在寻找用于Python的mongodb和mongoengine.通过这样做,我是否采取了正确的方向?
编辑2以回应一些答案/评论:
从最你的答案,我的结论是在关系图表和列的动态创建/删除是不是要走的路.这已经是有价值的信息.另外,有一种观点认为,对实体和属性进行动态修改的整个想法可能是糟糕的设计.
正如这种动态性质应该是应用程序的主要目的/特征,我不放弃这一点.从理论的角度来看,我接受在动态数据模型上执行操作必须比在静态数据模型上执行操作慢.这完全没问题.
以抽象的方式表达,应用程序需要管理
我正在寻找一种智能有效的方法来实现这一点.从你的答案来看,看起来NoSQL是这里的方式,这是另一个重要的结论.
GNU查找是否有办法查找大小>=或<=特定大小的文件?我只找到了>,<,==运营商,例如-size +1M,-size -1M,-size 1M,分别.
在这篇博客中,作者提出了多个-size参数的组合,如find . -type f -size +1M -size -2M.但是,这对我的查找(GNU findutils)4.4.2不起作用.
我想实现一个(开源)Web应用程序,用户通过他的浏览器向Python Web应用程序发送某种请求.请求数据用于定义和提交某种繁重的计算工作.计算工作外包给"工作人员后端"(也称为Python).在作业处理期间,作业会随着时间的推移经历不同的阶段(从"提交"到中间状态到"完成",理想情况).我想要实现的是实时向用户显示当前的作业状态.这意味着工作者后端必须将作业状态传递回Web应用程序.然后,Web应用程序必须将信息推送到用户的浏览器.我给你带了一张图片,示意性地描述了基本的想法:
红色圆圈中的数字表示事件的时间顺序."web app"和"worker backend"仍有待设计.现在,如果您可以帮助我做出一些技术决定,我将不胜感激.
我的问题,特别是:
我应该在Web应用程序和工作人员后端之间应用哪种消息传递技术? 当工作人员后端发出关于某个作业的信号(某种消息)时,它必须在Web应用程序中触发某个事件.因此,我需要某种与最初请求作业提交的客户端相关联的回调.我想我需要一些pub/sub机制,工作者后端发布,Web应用程序订阅.当Web应用程序收到消息时,它会通过向客户端发送状态更新来对其做出反应.我希望工作者后端可以扩展并与Web应用程序强烈分离.因此,我正在考虑使用Redis或ZeroMQ来完成这项任务.你怎么看?我的整个方法有点过于复杂吗?
我应该使用哪种技术将信息推送到浏览器? 出于完美主义,我希望得到实时更新.我不想以高频率进行民意调查.当工作人员后端发出消息时,我希望立即推送到客户端:-).此外,我不需要最大的浏览器支持.这个项目首先或多或少是我自己的技术.我应该去HTML5服务器发送的事件/ websockets吗?或者你会推荐否则?
非常感谢您提前提出的建议.
为某个信号指定处理程序的经典方法是via sigaction.Linux还提供了signalfd功能,我们可以将信号连接到文件描述符,然后将select /(e)poll应用于该描述符,这完全符合许多事件循环驱动系统的概念.
我想知道当两种机制发生碰撞时会发生什么/应该发生什么.有竞争条件吗?在signalfd联机帮助页(http://man7.org/linux/man-pages/man2/signalfd.2.html)上,我们读到:
通常,应使用sigprocmask(2)阻止通过文件描述符接收的信号集,以防止根据其默认处置来处理信号.
因此,它说"通常"我们使用信号掩码以防止(默认)处理程序处理信号.它并没有说我们必须在连接文件描述符时阻止该信号.不幸的是,手册页没有说明当我们不阻止信号时会发生什么.
这看起来像定义不明确的行为.我不相信这实际上没有明确定义,我想知道这里是否有人知道我是否可以找到关于系统应该如何表现的详细规范或ii)它的行为方式.
我特别感兴趣的是这个执行顺序:
这是未定义的行为还是存在必须发生的标准/规范?处理程序是否始终优先于文件描述符?是否调用了处理程序并且文件描述符触发了事件?设置是否sigaction更改信号掩码,不需要渲染步骤(2)?
我可以尝试从涉及实际代码的系统测试中推导出实际行为.但是,我当然更愿意找到一份详细的文档,并认为我自己找不到合适的参考资料.
今天我反对这样一个事实,即sys.exit()从一个子线程调用并不会杀死主进程.我以前不知道这个,这没关系,但我需要很长时间才能意识到这一点.它本来可以节省很多时间,如果sys.exit(msg)打印msg的话stderr.但事实并非如此.
事实证明,这不是我的应用程序中的真正错误; 它sys.exit(msg)以一种有意义的错误调用了一个有意义的错误 - 但我只是看不到这一点.
在文档中sys.exit()说明:
"[...]打印任何其他对象sys.stderr并导致退出代码为1"
对于来自子线程的调用,情况并非如此,其中sys.exit()显然表现为thread.exit():
"引发SystemExit异常.当未捕获时,这将导致线程以静默方式退出"
我认为当程序员想要sys.exit(msg)打印错误消息时,应该只打印它 - 独立于调用它的位置.为什么不?我目前看不出任何理由.至少在文档中应该有一个暗示,sys.exit()即消息不是从线程打印的.
你怎么看?为什么错误消息会隐藏在线程中?这有意义吗?
最好的祝福,
Jan-Philip Gehrcke
我想调整大量(约5200)图像文件(PPM格式,每个5 MB大小)的大小,并使用它们保存为PNG格式convert.
精简版:
convert虽然我使用了convert连续处理图像文件的语法,但它会耗尽24 GB的内存.
长版:
关于超过25 GB的图像数据,我认为我不应该同时处理所有文件.我搜索了有关如何连续处理图像文件的ImageMagick文档,我发现:
调整每个读取图像的速度更快,资源更少:
$ convert '*.jpg[120x120]' thumbnail%03d.png
此外,该教程还指出:
例如,而不是......
montage '*.tiff' -geometry 100x100+5+5 -frame 4 index.jpg它首先读取所有tiff文件,然后调整它们的大小.你可以做......
montage '*.tiff[100x100]' -geometry 100x100+5+5 -frame 4 index.jpg这将读取每个图像,并在继续下一个图像之前调整它们的大小.当达到内存限制时,导致内存使用量大大减少,并可能阻止磁盘交换(颠簸).
因此,这就是我在做的事情:
$ convert '*.ppm[1280x1280]' pngs/%05d.png
Run Code Online (Sandbox Code Playgroud)
根据文档,它应该逐个处理每个图像文件:读取,调整大小,写入.我在具有12个真实内核和24 GB RAM的机器上执行此操作.但是,在前两分钟内,该convert进程的内存使用量增长到大约96%.它会停留在那里一段时间.CPU使用率最高.稍长一点,过程就死了,只说:
杀害
此时,尚未生成任何输出文件.我在Ubuntu 10.04上convert --version说:
Version: ImageMagick 6.5.7-8 2012-08-17 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2009 ImageMagick Studio LLC
Features: OpenMP
Run Code Online (Sandbox Code Playgroud)
它看起来像是convert在开始转换之前尝试读取所有数据.因此,要么存在错误convert,文档存在问题,要么我没有正确阅读文档.
怎么了?如何在调整大量图像文件的同时实现低内存使用量?
BTW:一个快速的解决方案是使用shell循环遍历文件并convert独立调用每个文件.但我想了解如何使用纯ImageMagick实现相同目标. …
linux image imagemagick image-processing imagemagick-convert
我很惊讶在基于jQuery的CSS属性更改后通过jQuery应用的CSS3转换规则实际上动画了此属性更改.请看http://jsfiddle.net/zwatf/3/:
最初,div由两个类设置样式,并且由于这两个类的默认CSS属性而具有一定的高度(200px).然后通过删除一个类使用jQuery修改高度:
$('.container').removeClass('active');
Run Code Online (Sandbox Code Playgroud)
这将高度从200px降低到15px.
之后,通过添加类将转换规则应用于容器:
$('.container').addClass('all-transition');
Run Code Online (Sandbox Code Playgroud)
发生的事情是高度的降低变得生动(至少在Firefox和Chrome上).在我的世界中,如果指令的顺序有任何意义,这不应该发生.
我想这种行为可以很好地解释.为什么会这样?我该怎样预防呢?
这就是我想要实现的目标:
(1)和(2)应该尽快发生,所以我不喜欢任意延迟.
我试图找出一个整数列表是连贯的还是"在一个范围内",这意味着两个相邻元素之间的差异必须是一个,并且数字必须单调递增.我找到了一个简洁的方法,我们可以按列表中的数字减去列表中元素的位置进行分组 - 当数字不连贯时,这种差异会发生变化.显然,当序列不包含间隙或重复时,应该只有一个组.
测试:
>>> l1 = [1, 2, 3, 4, 5, 6]
>>> l2 = [1, 2, 3, 4, 5, 7]
>>> l3 = [1, 2, 3, 4, 5, 5]
>>> l4 = [1, 2, 3, 4, 5, 4]
>>> l5 = [6, 5, 4, 3, 2, 1]
>>> def is_coherent(seq):
... return len(list(g for _, g in itertools.groupby(enumerate(seq), lambda (i,e): i-e))) == 1
...
>>> is_coherent(l1)
True
>>> is_coherent(l2)
False
>>> is_coherent(l3)
False
>>> is_coherent(l4)
False …Run Code Online (Sandbox Code Playgroud)