小编Tom*_*Tom的帖子

Python多处理:如何从子进程可靠地重定向stdout?

NB.我已经看到了multiprocessing.Process的日志输出 - 遗憾的是,它没有回答这个问题.

我正在通过多处理创建一个子进程(在Windows上).我希望将所有子进程的stdout和stderr输出重定向到日志文件,而不是出现在控制台上.我看到的唯一建议是子进程将sys.stdout设置为文件.但是,由于Windows上的stdout重定向行为,这不能有效地重定向所有stdout输出.

要说明此问题,请使用以下代码构建Windows DLL

#include <iostream>

extern "C"
{
    __declspec(dllexport) void writeToStdOut()
    {
        std::cout << "Writing to STDOUT from test DLL" << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后创建并运行如下所示的python脚本,它导入此DLL并调用该函数:

from ctypes import *
import sys

print
print "Writing to STDOUT from python, before redirect"
print
sys.stdout = open("stdout_redirect_log.txt", "w")
print "Writing to STDOUT from python, after redirect"

testdll = CDLL("Release/stdout_test.dll")
testdll.writeToStdOut()
Run Code Online (Sandbox Code Playgroud)

为了看到与我相同的行为,可能需要针对与Python使用的不同的C运行时构建DLL.在我的例子中,python是使用Visual Studio 2010构建的,但我的DLL是使用VS 2005构建的.

我看到的行为是控制台显示:

> stdout_test.py

Writing to STDOUT from python, before redirect

Writing to STDOUT …
Run Code Online (Sandbox Code Playgroud)

python windows stdout multiprocessing stderr

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

Django filter()在相关模型的字段上

我想我错过了一些非常基本和基本的关于Django的filter()方法应该如何工作的东西.

使用以下型号:

class Collection(models.Model): 
    pass

class Item(models.Model):
    flag = models.BooleanField()
    collection =  models.ForeignKey(Collection)
Run Code Online (Sandbox Code Playgroud)

并通过调用问题底部的populate()函数提供的数据,尝试在./manage.py shell中执行以下命令:

len(Collection.objects.filter(item__flag=True))
Run Code Online (Sandbox Code Playgroud)

我的期望是这会打印"2",这是至少有一个Item为flag = True的集合的数量.这个期望是基于https://docs.djangoproject.com/en/1.5/topics/db/queries/#lookups-that-span-relationships上的文档,其中有一个示例说明"此示例检索所有Entry对象一个名为"Beatles Blog"的博客.

但是,上面的调用实际打印"6",这是具有flag = True的Item记录的数量.但是,返回的实际对象是Collection对象.它似乎是多次返回相同的Collection对象,对于每个对应的Item记录,其中flag = True.这可以通过以下方式确认:

queryset = Collection.objects.filter(item__flag=True)
queryset[0] == queryset[1]
Run Code Online (Sandbox Code Playgroud)

打印True.

这是正确的行为吗?如果是的话,理由是什么?如果它是预期的,文档可以被解释为严格正确,但它省略了说每个对象可以多次返回.

这是一个相关的例子,这似乎是非常令人惊讶的(或者只是错误的)行为.它引发了我在自定义模型管理器添加exclude()调用并且调用者然后添加filter()的情况:

from django.db.models import Count    
[coll.count for coll in Collection.objects.filter(item__flag=True).annotate(count=Count("item"))]
[coll.count for coll in Collection.objects.exclude(item=None).filter(item__flag=True).annotate(count=Count("item"))]
Run Code Online (Sandbox Code Playgroud)

第一个案例打印"[2,4]",但第二个打印"[8,16]"!!!

填充功能:

def populate():
    Collection.objects.all().delete()

    collection = Collection()
    collection.save()
    item = Item(collection=collection, flag=True)
    item.save()
    item = Item(collection=collection, flag=True)
    item.save()
    item = Item(collection=collection, flag=False)
    item.save()
    item = Item(collection=collection, flag=False)
    item.save()

    collection …
Run Code Online (Sandbox Code Playgroud)

django django-models django-queryset

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

如何在SQL Server中有效地合并两个层次结构?

我有两个带有hierarchyid字段的表,其中一个是具有需要合并到另一个的新数据的临时表(即,需要添加到主树的一组节点,其中一些可能已经是那里).

除了定义树结构(父/子关系)的hierarchyid列之外.每个表都有一个单独的列,其中包含唯一标识每个节点的节点标识符.也就是说,判断登台表中的节点是否已经在主表中的方法是通过节点ID,而不是通过hierarchyid列.

当然,需要执行的处理看起来像这样:

For each row, RS, in the staging table:
    If there is not already a row with the same Id as RS in the main table:
         Find the parent, PS, of the staging row
         Find the row, PM, in the main table that has the same node ID as PS
         Create a new child, RM of row PM
         Set PM's ID equal to the ID of RS
Run Code Online (Sandbox Code Playgroud)

重要的是,这种方法只有在登台表中的树以广度优先顺序排序/遍历时才有效 - 这样当遇到RS时,可以保证其父PS在主表中已经有相应的行.

到目前为止,我在SQL服务器中看到实现此目的的唯一方法是在登台表(已经排序)上使用游标,并为每一行调用一个存储过程,基本上完全按照上面描述的那样完成,并使用SELECT完成MAX()用于查找已作为PM的子项存在的最高hierarchyid,以便可以唯一地添加子项.

然而,这是一种非常低效的方法,并且对于我的目的来说太慢了.有没有更好的方法?

对于背景,这是我正在进行的一种可行性检查.我需要弄清楚我是否可以在SQL Server中快速执行此操作.如果事实证明我不能在数据库之外以另一种方式做到这一点.树的合并是固有的(实际上,在某种意义上一种)的问题域,所以结构化数据不同或采取更广泛的看法,并试图以某种方式完全避免执行此操作是不是一种选择.

更新

根据要求,这是一个具体的例子. …

sql sql-server hierarchyid hierarchical-data sql-server-2008

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

如何在不同平台(例如Pycharm)中调试IntelliJ插件

我有PyCharm Professional的许可证,我正在使用IntelliJ IDEA Community Edition为它开发插件.我需要在PyCharm中运行插件来测试它.我不能使用IntelliJ IDEA的Python插件来测试它,因为只有该插件的社区版本似乎可供我使用.如果我手动下载专业版并尝试安装它我得到Plugin 'Python' is incompatible with this installation.我假设我需要IntelliJ IDEA Ultimate才能使用专业版的Python插件.

我看到了这个问题,这表明可以使用PyCharm作为"插件"运行配置的目标,但是我没有跟上这些步骤的运气.我把JRE设置为/opt/pycharm-professional/jre64但得到了Exception in thread "main" java.lang.ClassNotFoundException: com.intellij.idea.Main.然后我从一个正在运行的PyCharm实例中抓取了java命令行args并添加了(特别是类路径)但得到了Error: Could not find or load main class com.intellij.rt.execution.application.AppMainV2.我无法在文档中找到有关如何设置它的任何内容.

intellij-idea pycharm

7
推荐指数
0
解决办法
181
查看次数

Windows上的Python Popen具有多线程 - 无法删除stdout/stderr日志

在Windows上使用python 2.7.4(注意:WinXP - 下面的评论者建议在Win7上正常工作),我有一个脚本创建几个线程,每个线程通过Popen运行子进程,stdout/stderr重定向到文件和调用等待().每个Popen都有自己的stdout/stderr文件.每个进程返回后,我有时必须删除文件(实际上将它们移动到其他地方).

我发现在所有wait()调用返回之前我都无法删除stdout/stderr日志.在此之前,我得到"WindowsError:[错误32]该进程无法访问该文件,因为它正被另一个进程使用".看起来,只要至少有一个子进程打开,Popen就会以某种方式保留stderr文件,即使这些文件没有共享.

测试代码重现如下.

C:\ test1.py

import subprocess
import threading
import os

def retryDelete(p, idx):
    while True:
        try:
            os.unlink(p)
        except Exception, e:
            if "The process cannot access the file because it is being used by another process" not in e:
                raise e
        else:
            print "Deleted logs", idx
            return

class Test(threading.Thread):
    def __init__(self, idx):
        threading.Thread.__init__(self)
        self.idx = idx

    def run(self):
        print "Creating %d" % self.idx
        stdof = open("stdout%d.log" % self.idx, "w")
        stdef = open("stderr%d.log" % self.idx, "w")
        p = …
Run Code Online (Sandbox Code Playgroud)

python windows-xp subprocess python-multithreading python-2.7

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

如何将变换矩阵应用于SceneKit中的向量

我在这里错过了什么吗?在各类矢量/矩阵功能,在这里,我看不到任何功能,只需申请一个SCNMatrix4变换到SCNVector4.我当然可以通过写出矩阵/向量乘法来做到这一点,但肯定不需要吗?

原因是我正在分两步更新相机的投影变换.首先,我需要将一个变换应用于原始变换,然后我需要将此变换应用于向量以计算出一个数字,然后根据该数字我需要在顶部应用进一步的变换.

由于看起来调用setProjectionTransform没有立竿见影的效果(我假设它在当前事务提交时发生),我无法调用projectPoint将转换应用于其中间状态.因此,我一直在寻找构建转换矩阵并手动应用它.

当然必须有一个函数在这里做一个你可能想要用矩阵和向量做的最基本的东西???

scenekit

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