请考虑以下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) 我使用 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) 作为练习,我在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) 早在 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) 我在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应用程序 …
这是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) 这是我的问题Hang in Python script using SQLAlchemy and multiprocessing 的后续问题。正如该问题中所讨论的,酸洗异常在 Python 中是有问题的。这通常不是问题,但有一种情况是,Python 多处理模块中发生错误。由于多处理通过酸洗来移动对象,因此如果多处理过程中发生错误,整个过程可能会挂起,如该问题所示。
\n\n一种可能的方法是修复所有有问题的异常,如该问题中所讨论的。这并不容易,因为人们无法轻易地提前知道可以调用哪些异常。lbolla 在回答问题时建议的另一种方法是捕获异常,构造一个等效的无害异常,然后重新抛出。\n但是,我不确定具体如何执行此操作。考虑以下代码。
\n\nclass 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]\nRun Code Online (Sandbox Code Playgroud)\n\n此代码对异常进行pickles和unpickles,然后抛出它,给出错误
\n\nraising error\nTraceback (most recent call last):\n File "<stdin>", …Run Code Online (Sandbox Code Playgroud) 我在 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 …
我正在尝试弄清楚如何为多个版本的 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) 返回字符串和数字向量中元素的位置,以及字符向量的使用 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) python ×5
common-lisp ×3
sbcl ×2
sqlalchemy ×2
automake ×1
autotools ×1
c++ ×1
c++11 ×1
debian ×1
django ×1
exception ×1
mcmc ×1
packages ×1
performance ×1
postgresql ×1
slime ×1
statistics ×1
templates ×1
tuples ×1
unit-testing ×1
vector ×1