我试图使用boost.python将一段C++代码包装到python lib中,但是,我发现多个实例不能同时运行:
代码(C++):
class Foo{
public:
Foo(){}
void run(){
int seconds = 2;
clock_t endwait;
endwait = clock () + seconds * CLOCKS_PER_SEC ;
while (clock() < endwait) {}
}
};
BOOST_PYTHON_MODULE(run_test)
{
using namespace boost::python;
class_<Foo>("test", init<>())
.def("run", &Foo::run)
;
}
Run Code Online (Sandbox Code Playgroud)
这是使用CMake(CMake)编译的:
add_library(run_test SHARED run_test.cpp)
target_link_libraries(run_test boost_python python2.7)
Run Code Online (Sandbox Code Playgroud)
并使用以下代码(Python)进行测试:
class Dos(threading.Thread):
def run(self):
printl('performing DoS attack')
proc = test()
proc.run()
for i in range(5):
t = Dos()
t.start()
Run Code Online (Sandbox Code Playgroud)
输出表明代码以非常奇怪的方式并行化.每个线程应该只需要2秒钟,并且我的四核机器上应该同时运行4个线程:
[2011-11-04 13:57:01] performing DoS attack
[2011-11-04 13:57:01] performing DoS attack …Run Code Online (Sandbox Code Playgroud) 我想知道是否有办法将zip文件上传到django web服务器并将zip文件放入django数据库而不访问过程中的实际文件系统(例如将zip文件解压缩到tmp目录然后加载它们)
Django提供了一个将python文件转换为Django文件的函数,所以如果有一种方法将ZipExtFile转换为python文件,它应该没问题.
感谢帮助!
Django模型:
from django.db import models
class Foo:
file = models.FileField(upload_to='somewhere')
Run Code Online (Sandbox Code Playgroud)
用法:
from zipfile import ZipFile
from django.core.exceptions import ValidationError
from django.core.files import File
from io import BytesIO
z = ZipFile('zipFile')
istream = z.open('subfile')
ostream = BytesIO(istream.read())
tmp = Foo(file=File(ostream))
try:
tmp.full_clean()
except Validation, e:
print e
Run Code Online (Sandbox Code Playgroud)
输出:
{'file': [u'This field cannot be blank.']}
Run Code Online (Sandbox Code Playgroud)
[解决方案]解决方案使用丑陋的黑客:
正如Don Quest正确指出的那样,类似文件的类(如StringIO或BytesIO)应将数据表示为虚拟文件.但是,Django File的构造函数只接受内置文件类型而不接受任何其他内容,尽管类文件类也可以完成这项工作.黑客是手动设置Django :: File中的变量:
buf = bytesarray(OPENED_ZIP_OBJECT.read(FILE_NAME))
tmp_file = BytesIO(buf)
dummy_file = File(tmp_file) # this line actually fails
dummy_file.name = SOME_RANDOM_NAME …Run Code Online (Sandbox Code Playgroud) 我有一个具有以下结构的项目:
proj:
-CMakeLists.txt
-subdir0
-CMakeLists.txt
-app0.cpp
-app1.cpp
-subdir1
-CMakeLists.txt
-app2.cpp
Run Code Online (Sandbox Code Playgroud)
在构建之后,我喜欢:
proj:
-CMakeLists.txt
-subdir0
-CMakeLists.txt
-app0.cpp
-app1.cpp
-subdir1
-CMakeLists.txt
-app2.cpp
-build
-subdir0
-app0.exec
-app1.exec
-subdir1
-app2.exec
Run Code Online (Sandbox Code Playgroud)
CMake文档很难阅读,我在这里需要的只是一个例子(例如现有项目)如何设置它...
非常感谢!
以下问题刚刚从头脑中射出.对于c ++ stl迭代器,通常的做法是使用类似的东西:
for (iterator it=obj.begin(); it!=obj.end(); it++)
Run Code Online (Sandbox Code Playgroud)
我想知道的是,实际上obj.begin()可以告诉"它"何时停止哪个会使for循环看起来像:
for (iterator it=obj.begin(); !it.end(); it++)
Run Code Online (Sandbox Code Playgroud)
好处是使迭代器更加自包含,并且可以在容器类中保存(迭代器end()).
我有以下问题:
#include <vector>
#include <iostream>
using namespace std;
class Mat {
public:
typedef vector<float>::size_type size_type;
Mat (size_type k, size_type m)
:data_(k*m){}
inline vector<float> data() const {return data_;}
vector<float> data_;
};
int main(){
Mat f (6, 10);
cout << f.data().size() << " " << f.data().end() - f.data().begin();
}
Run Code Online (Sandbox Code Playgroud)
输出为60 122.
我以为整个矢量data_一遍又一遍地移动,但是为什么在这个操作之后begin()end()无效?
我有一个非常简单的问题,我认为我只是在做一些愚蠢的事情,但几个小时都找不到这个bug.
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
typedef unsigned int uint;
enum {ASCEND, DESCEND};
template<typename T>
bool ascend_sort(pair<uint, T> i, pair<uint, T> j){return j.second>i.second;}
template<typename T>
bool descend_sort(pair<uint, T> i, pair<uint, T> j){return i.second>j.second;}
template<typename T>
void sortIdx(vector<uint>& idx, const vector<T>& src, int dir=ASCEND){
vector< pair<uint, T> > tmp (src.size());
for (uint i=0; i<src.size(); i++){
tmp.push_back(pair<uint, T>(i, src[i]));
cout << i << " " << src[i] << " \n";
}
if (dir==ASCEND){
sort(tmp.begin(), tmp.end(), ascend_sort<T>);
}else{
sort(tmp.begin(), …Run Code Online (Sandbox Code Playgroud) 我有以下单元测试代码,它基本上通过序列化和反序列化来复制对象:
FloatMat mat2;
assert(mat2.ParseFromString(mat.SerializeAsString()));
cout << mat.vec_size() << "\n";
cout << mat2.vec_size() << "\n";
Run Code Online (Sandbox Code Playgroud)
使用cmake调试模式构建时,它会按预期方式给出:
2
2
Run Code Online (Sandbox Code Playgroud)
但是当使用cmake release模式构建时,它会给出:
2
0
Run Code Online (Sandbox Code Playgroud)
我对发布模式的构建不太熟悉,请帮忙!谢谢!