小编Fah*_*tha的帖子

使用SQLAlchemy和多处理挂起Python脚本

请考虑以下Python脚本,该脚本使用SQLAlchemy和Python多处理模块.这是在Debian squeeze上使用Python 2.6.6-8 + b1(默认)和SQLAlchemy 0.6.3-3(默认).这是一些实际代码的简化版本.

import multiprocessing
from sqlalchemy import *
from sqlalchemy.orm import *
dbuser = ...
password = ...
dbname = ...
dbstring = "postgresql://%s:%s@localhost:5432/%s"%(dbuser, password, dbname)
db = create_engine(dbstring)
m = MetaData(db)

def make_foo(i):
    t1 = Table('foo%s'%i, m, Column('a', Integer, primary_key=True))

conn = db.connect()
for i in range(10):
    conn.execute("DROP TABLE IF EXISTS foo%s"%i)
conn.close()
db.dispose()

for i in range(10):
    make_foo(i)

m.create_all()

def do(kwargs):
    i, dbstring = kwargs['i'], kwargs['dbstring']

    db = create_engine(dbstring)
    Session = scoped_session(sessionmaker())
    Session.configure(bind=db)
    Session.execute("COMMIT; …
Run Code Online (Sandbox Code Playgroud)

python postgresql sqlalchemy multiprocessing

7
推荐指数
1
解决办法
5210
查看次数

重载operator << for std :: tuple - 可能的简化?

我使用 SO问题的答案"迭代元组"来编写一个重载方法<<.这个方法经过测试,似乎可以g++ 4.7在Debian squeeze上正常工作.

然而,这种方法有点迂回,因为它似乎<<无法明确实例化(我在这里发现了一篇关于它的帖子 ).因此,一个人被迫定义一个字符串方法,然后调用它.我有一个类似的矢量方法,更直接.有没有人建议如何消除创建字符串方法的额外步骤,使用相同的方法,或其他?提前致谢.

#include <tuple>
#include <iostream>
#include <string>
#include <sstream>
#include <vector>

using std::ostream;
using std::cout;
using std::endl;
using std::vector;
using std::string;

// Print vector<T>.
template<typename T> ostream& operator <<(ostream& out, const vector<T> & vec)
{
  unsigned int i;
  out << "[";
  for(i=0; i<vec.size(); i++)
    {
      out << vec[i];
      if(i < vec.size() - 1)
    out << ", ";
    }
  out << "]";
  return out;
}

////////////////////////////////////////////////////////////////

// …
Run Code Online (Sandbox Code Playgroud)

c++ templates tuples c++11 iterable-unpacking

7
推荐指数
1
解决办法
2355
查看次数

优化简单的Common Lisp gibbs采样程序

作为练习,我在Darren Wilkinson的各种语言(重新访问)的博客文章Gibbs采样器中重写了示例程序.

代码如下所示.这个代码在我的(5岁)机器上运行大约53秒,使用SBCL 1.0.56,使用buildapp创建核心映像,然后运行它

time ./gibbs > gibbs.dat
Run Code Online (Sandbox Code Playgroud)

由于这是如何计算帖子中其他语言的时间,我想我会做一些类似的事情.帖子中的C代码在大约25秒内运行.如果可能的话,我想尝试加速Lisp代码.

##############################
gibbs.lisp
##############################
(eval-when (:compile-toplevel :load-toplevel :execute)
  (require :cl-rmath) (setf *read-default-float-format* 'double-float))

(defun gibbs (N thin)
  (declare (fixnum N thin))
  (declare (optimize (speed 3) (safety 1)))
  (let ((x 0.0) (y 0.0))
    (declare (double-float x y))
    (print "Iter x y")
    (dotimes (i N)
      (dotimes (j thin)
    (declare (fixnum i j))
    (setf x (cl-rmath::rgamma 3.0 (/ 1.0 (+ (* y y) 4))))
    (setf y (cl-rmath::rnorm (/ 1.0 (+ x …
Run Code Online (Sandbox Code Playgroud)

statistics performance sbcl common-lisp mcmc

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

SQLAlchemy 出现“类已定义主映射器”错误

早在 2010 年 10 月,我就将这个问题发布到 Sqlalchemy 用户列表中。当时,我只是使用了clear_mappers消息中提到的解决方法,并没有尝试找出问题所在。我真是太淘气了。今天我再次遇到这个错误,并决定构建一个最小的示例,如下所示。Michael 在 2006 年也曾讨论过可能是同样的问题。我决定在这里跟进,让 Michael 从我愚蠢的问题中解脱出来。

因此,结果似乎是,对于给定的类定义,不能定义多个映射器。就我而言,我在Pheno模块作用域中声明了类(我假设这是此处的顶级作用域),并且每次make_tables运行时,它都会尝试定义另一个映射器。

Mike 写道:“根据上述问题的描述,您需要确保您的 Python 类在与映射器相同的范围内声明。您收到的错误消息表明‘Pheno’是在模块级别声明的。” 这可以解决这个问题,但是我如何在不改变当前结构的情况下解决这个问题呢?如果有的话,我还有哪些其他选择?显然映射器没有像“如果映射器已经定义,则退出而不执行任何操作”之类的选项,这可以很好地处理它。我想我可以定义一个包装函数,但这会非常难看。

from sqlalchemy import *
from sqlalchemy.orm import *

def make_pheno_table(meta, schema, name='pheno'):
    pheno_table = Table(
        name, meta,
        Column('patientid', String(60), primary_key=True),
        schema=schema,
        )
    return pheno_table

class Pheno(object):
    def __init__(self, patientid):
        self.patientid = patientid

def make_tables(schema):
    from sqlalchemy import MetaData
    meta = MetaData() 
    pheno_table = make_pheno_table(meta, schema)
    mapper(Pheno, pheno_table)
    table_dict = {'metadata': meta, 'pheno_table':pheno_table} …
Run Code Online (Sandbox Code Playgroud)

sqlalchemy

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

django对象id在单元测试之间递增

我在Debian上使用Django 1.2.3-3 + squeeze1使用PostgreSQL 8.4.7-0squeeze2(尽管我认为PostgreSQL与此无关),并使用以下setUp和tearDown运行基于unittest的Django单元测试

   def setUp(self):
        print "running setup"
        self.c = Client()
        self.user = User.objects.create_user('faheem', 'faheem@email.unc.edu', 'foo')
        self.logged_in = self.c.login(username='faheem', password='foo')
        settings.MEDIA_ROOT='/tmp/'
        #settings.ZIP_UPLOAD='/var/tmp/zip/'

    def tearDown(self):
        print "running teardown"
        FolderUpload.objects.all().delete()
        FileUpload.objects.all().delete()
        ZipFileUpload.objects.all().delete()
        OldFileUpload.objects.all().delete()
        # FIXME: Quick & dirty fix for the time being. Should make this a delete method.
        os.system("rm -rf "+ settings.ZIP_UPLOAD + "/*")
Run Code Online (Sandbox Code Playgroud)

我们的想法是在运行单元测试之间从数据库中删除所有内容.根据unittest文档,这是什么tearDown.我遇到的问题是在不同的单元测试之间似乎仍然保存了一些状态.具体来说,我看到id增加了.因此,假设我创建了一个ZipFileUpload对象test1,然后创建了一个ZipFileUpload对象test2,那么我希望两个ID都可以1,但我看到的是id 1for test1和id 2for test2.如果id来自这些表之外的某个索引,那么这将是有意义的.我不太了解Diango如何知道这是否实际上是这样的.如果他们这样做,我不知道为什么.关于这一点的任何澄清将不胜感激.

无论如何,如果有人可以推荐数据库,我会满足于放弃数据库.应该采用这种方法teadDown.测试Django应用程序 …

python django unit-testing django-testing

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

主程序或清理中可能发生错误时的异常处理

这是Debian Squeeze上的Python 2.6.6(默认).请考虑以下Python代码.

import sys
try:
    raise Exception("error in main")
    pass
except:
    exc_info = sys.exc_info()
finally:
    try:
        print "cleanup - always run"
        raise Exception("error in cleanup")
    except:
        import traceback
        print >> sys.stderr, "Error in cleanup"
        traceback.print_exc()
    if 'exc_info' in locals():
        raise exc_info[0], exc_info[1], exc_info[2]

print "exited normally"
Run Code Online (Sandbox Code Playgroud)

获得的错误是

Error in cleanup
Traceback (most recent call last):
  File "<stdin>", line 10, in <module>
Exception: error in cleanup
cleanup - always run
Traceback (most recent call last):
  File "<stdin>", line 3, in …
Run Code Online (Sandbox Code Playgroud)

python exception-handling

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

捕获无法处理的异常并重新加注

这是我的问题Hang in Python script using SQLAlchemy and multiprocessing 的后续问题。正如该问题中所讨论的,酸洗异常在 Python 中是有问题的。这通常不是问题,但有一种情况是,Python 多处理模块中发生错误。由于多处理通过酸洗来移动对象,因此如果多处理过程中发生错误,整个过程可能会挂起,如该问题所示。

\n\n

一种可能的方法是修复所有有问题的异常,如该问题中所讨论的。这并不容易,因为人们无法轻易地提前知道可以调用哪些异常。lbolla 在回答问题时建议的另一种方法是捕获异常,构造一个等效的无害异常,然后重新抛出。\n但是,我不确定具体如何执行此操作。考虑以下代码。

\n\n
class BadExc(Exception):\n    def __init__(self, message, a):\n        \'\'\'Non-optional param in the constructor.\'\'\'\n        Exception.__init__(self, message)\n        self.a = a\n\nimport sys\ntry:\n    try:\n        #print foo\n        raise BadExc("bad exception error message", "a")\n    except Exception, e:\n        raise Exception(e.__class__.__name__ + ": " +str(e)), None, sys.exc_info()[2]\nexcept Exception, f:\n    pass\n\nimport cPickle\na = cPickle.dumps(f)\nl = cPickle.loads(a)\nprint "raising error"\nraise sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2]\n
Run Code Online (Sandbox Code Playgroud)\n\n

此代码对异常进行pickles和unpickles,然后抛出它,给出错误

\n\n
raising error\nTraceback (most recent call last):\n  File "<stdin>", …
Run Code Online (Sandbox Code Playgroud)

python exception multiprocessing

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

在 Debian 上使用 SLIME 在 Common Lisp 中加载外部包

我在 Debian 挤压上使用 SBCL 1.0.56,带有 cl-swank/slime 1:20120420-2(Debian 版本号)。这些都是不稳定的当前版本。

我在加载第三方 CL 包时遇到问题。在 Debian 上使用 CL 的文档(实际上是在 Linux 上更通用的 CL 使用文档)是粗略的、矛盾的和过时的,所以我将总结我所知道的。这就是我所在的地方。

Debian 在 /usr/share/common-lisp/source. 在拆分序列的情况下,这是 /usr/share/common-lisp/source/cl-split-sequence

.asd 文件(这里 /usr/share/common-lisp/source/cl-split-sequence/split-sequence.asd),据我所知,它向 CL 实现提供有关版本和依赖项的说明,看起来像

;;; -*- Lisp -*- mode
(defpackage #:split-sequence-system (:use #:cl #:asdf))
(in-package :split-sequence-system)

(defsystem :split-sequence
    :version "20011114.1"
    :components ((:file "split-sequence")))
Run Code Online (Sandbox Code Playgroud)

现在,在运行 slime 时,在 REPL 中输入以下两行没有问题

(require :split-sequence)
(split-sequence:SPLIT-SEQUENCE  #\, "foo,bar")
Run Code Online (Sandbox Code Playgroud)

(require :split-sequence)所调用(我认为),航空自卫队的内置副本里SBCL,这大概看split-sequence.asd。这可能是特定SBCL 的,请参阅Debian 手册第 3 章 -Libraries 中的 Common Lisp。值得注意的是,这个页面与我遇到的任何内容一样有用和详细,经常引用 CLC(Common …

debian packages sbcl common-lisp slime

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

使用 autotools 构建和安装多个版本的 Python

我正在尝试弄清楚如何为多个版本的 Python 构建我的项目。我正在 Debian wheezy 上测试这个,Python 的默认版本是 2.7。但也支持并安装 2.6。但是,automake 仅针对 Python 2.7 进行安装和编译。我希望它也能编译 2.6。

这是configure.ac 和Makefile.am。如有必要,我可以提供更多详细信息,但希望这些就足够了。

我是 Autotools 的初学者,所以可能有一些明显的解决方案。

这似乎是一个愿望清单错误: RFE: build against multiple python stacks。这里也有类似的讨论:RFC: (automake) add support for Dual python 2 / python 3 builds

还有一个建议的解决方案(看起来很复杂),在 CDBS + Autotools + Python中给出

这是configure.ac。

##################################################################################
#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.69])
AC_INIT([corrmodel], [0.1], [faheem@faheem.info])
AM_INIT_AUTOMAKE([foreign -Wall -Werror -Wno-extra-portability parallel-tests])
AM_MAINTAINER_MODE
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile])

# Checks for programs. …
Run Code Online (Sandbox Code Playgroud)

python automake build-process autotools

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

在常见的lisp中查找字符串向量中元素的位置

返回字符串和数字向量中元素的位置,以及字符向量的使用 position

CL-USER> (position #\T  "ACGT")
3
CL-USER> (position 2  #(1 2 3 4))
1

CL-USER> (position #\A  #(#\A #\C #\G #\T))
0
Run Code Online (Sandbox Code Playgroud)

字符串向量的以下内容不起作用.我认为这是因为字符串本身就是一个字符向量.那么,一个人可以使用什么?

CL-USER> (position "A"  #("A" "C" "G" "T"))
NIL
Run Code Online (Sandbox Code Playgroud)

vector common-lisp

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