Python 的开发环境

建议在Windows 下开发,成本低廉,简单,效率高。

综合下:开发的程序,Python  Django (Mysql,PostgreSQL) Nginx Redis ,这一组组合可以适应不同的平台,Linux 或者 Windows Server 下。。

Python版本:

推荐2.X系列,2.7是用的较多的。3.0N多不兼容。。。。想尝鲜的,呵呵呵呵

Windows-->Visual Studio2013 +PTVS2.2

Mac -->Xcode

Linux -->vi pycharm ......呵呵呵呵

也有用Pycharm 或者Eclipse的,亲身试试就知道那款合适了。不做比较。

小贴士:SharpDevelop_3.1。。。。。用这个来进行C# 项目代码的转化,你懂得。。。。

Web 框架:Django,Web.py 其他不考虑呵呵呵,你懂

数据库:Mysql Pgsql (Sqlite 额太mini,袖珍。Oracle 略贵 SqlServer 额,仅Windows.................MonoDB  Nosql 等等等,争议太多,不要图新鲜,做试验品)

缓存:Memcached 或者Redis

Server:Nginx -->OpenResty

OpenResty - a fast web app server by extending nginx

、Tornado、Apache

前端:Jquery、 bootstrap、 kando

源码管理:vs  的 直接TFS,也可换成git

ORM工具:Django自带的或者 SQLAlchemy

序列化争议:

pickle和cPickle:Python对象的序列化(上)

pickle和cPickle:Python对象的序列化(下)

JianZhen 275 1月17日 发布

  • 推荐 1 推荐
  • 收藏 4 收藏,2k 浏览

目的:Python对象序列化
可用性:pickle至少1.4版本,cPickle 1.5版本以上



pickle模块实现了一种算法,将任意一个Python对象转化成一系列字节(byets)。此过程也调用了serializing对象。代表对象的字节流之后可以被传输或存储,再重构后创建一个拥有相同特征(the same characteristics)的新的对象。

cPickle使用C而不是Python,实现了相同的算法。这比Python实现要快好几倍,但是它不允许用户从Pickle派生子类。如果子类对你的使用来说无关紧要,那么cPickle是个更好的选择。

警告:本文档直接说明,pickle不提供安全保证。如果你在多线程通信(inter-process communication)或者数据存储或存储数据中使用pickle,一定要小心。请勿信任你不能确定为安全的数据。

导入

如平常一样,尝试导入cPickle,给它赋予一个别名“pickle”。如果因为某些原因导入失败,退而求其次到Python的原生(native)实现pickle模块。如果cPickle可用,能给你提供一个更快速的执行,否则只能是轻便的执行(the portable implementation)。

try:
   import cPickle as pickle
except:
   import pickle

编码和解码

第一个例子将一种数据结构编码成一个字符串,然后把该字符串打印至控制台。使用一种包含所有原生类型(native types)的数据结构。任何类型的实例都可被腌渍(pickled,译者注:模块名称pickle的中文含义为腌菜),在稍后的例子中会演示。使用pickle.dumps()来创建一个表示该对象值的字符串。

try:
    import cPickle as pickle
except:
    import pickle
import pprint

data = [ { ‘a‘:‘A‘, ‘b‘:2, ‘c‘:3.0 } ]
print ‘DATA:‘,
pprint.pprint(data)

data_string = pickle.dumps(data)
print ‘PICKLE:‘, data_string

pickle默认仅由ASCII字符组成。也可以使用更高效的二进制格式(binary format),只是因为在打印的时候更易于理解,本页的所有例子都使用ASCII输出。

$ python pickle_string.py

DATA:[{‘a‘: ‘A‘, ‘b‘: 2, ‘c‘: 3.0}]
PICKLE: (lp1
(dp2
S‘a‘
S‘A‘
sS‘c‘
F3
sS‘b‘
I2
sa.

数据被序列化以后,你可以将它们写入文件、套接字、管道等等中。之后你也可以从文件中读取出来、将它反腌渍(unpickled)而构造一个具有相同值得新对象。

try:
    import cPickle as pickle
except:
    import pickle
import pprint

data1 = [ { ‘a‘:‘A‘, ‘b‘:2, ‘c‘:3.0 } ]
print ‘BEFORE:‘,
pprint.pprint(data1)

data1_string = pickle.dumps(data1)

data2 = pickle.loads(data1_string)
print ‘AFTER:‘,
pprint.pprint(data2)

print ‘SAME?:‘, (data1 is data2)
print ‘EQUAL?:‘, (data1 == data2)

如你所见,这个新构造的对象与原对象相同,但并非同一对象。这不足为奇。

$ python pickle_unpickle.py

BEFORE:[{‘a‘: ‘A‘, ‘b‘: 2, ‘c‘: 3.0}]
AFTER:[{‘a‘: ‘A‘, ‘b‘: 2, ‘c‘: 3.0}]
SAME?: False
EQUAL?: True

与流一起工作

dumps()loads()外,pickle还提供一对用在类文件流(file-like streams)的转化函数。可以往一个流中写对个对象,然后从流中把它们读取出来,此过程不需要预先写入的对象有几个、它们多大。

try:
    import cPickle as pickle
except:
    import pickle
import pprint
from StringIO import StringIO

class SimpleObject(object):

    def __init__(self, name):
        self.name = name
        l = list(name)
        l.reverse()
        self.name_backwards = ‘‘.join(l)
        return

data = []
data.append(SimpleObject(‘pickle‘))
data.append(SimpleObject(‘cPickle‘))
data.append(SimpleObject(‘last‘))

# 使用StringIO模拟一个文件
out_s = StringIO()

# 写入该流
for o in data:
    print ‘WRITING: %s (%s)‘ % (o.name, o.name_backwards)
    pickle.dump(o, out_s)
    out_s.flush()

# 建立一个可读流
in_s = StringIO(out_s.getvalue())

# 读数据
while True:
    try:
        o = pickle.load(in_s)
    except EOFError:
        break
    else:
        print ‘READ: %s (%s)‘ % (o.name, o.name_backwards)

这个例子使用SringIO缓存器(buffer)模拟流,所以在建立可读流的时候我们玩了一把。一个简单数据库的格式化也可以使用pickles来存储对象,只是shelve与之工作更加简便。

$ python pickle_stream.py

WRITING: pickle (elkcip)
WRITING: cPickle (elkciPc)
WRITING: last (tsal)
READ: pickle (elkcip)
READ: cPickle (elkciPc)
READ: last (tsal)

除了存储数据,pickles在进程间通信(inter-process communication)中也非常称手。例如,使用os.fork()os.pipe()可以创立工作者进程(worker processes),从一个管道(pipe)读取作业指令(job instruction)然后将结果写入另一个管道。管理工作者池(worker pool)和将作业送入、接受响应(response)的核心代码可被重用,因为作业和响应并不属于某个特定类中。如果你使用管道或者套接字(sockets),在通过连至另一端(end)的连接倾倒(dumps)所有对象、推送数据之后,别忘了冲洗(flush)。如果你想写自己的工作者池管理器,请看multiprocessing

原文:pickle and cPickle – Python object serialization - Python Module of the Week 的前半部分

pickle和cPickle:Python对象的序列化(下)

JianZhen 275 1月22日 发布

  • 推荐 0 推荐
  • 收藏 2 收藏,474 浏览

承接上文 pickle和cPickle:Python对象的序列化(上) 。

重构对象的问题

当与你自己的类一起工作时,你必须保证类被腌渍出现在读取pickle的进程的命名空间中。只有该实例的数据而不是类定义被腌渍。类名被用于在反腌渍时,找到构造器(constructor)以创建新对象。以此——往一个文件写入一个类的实例为例:

try:
    import cPickle as pickle
except:
    import pickle
import sys

class SimpleObject(object):

    def __init__(self, name):
        self.name = name
        l = list(name)
        l.reverse()
        self.name_backwards = ‘‘.join(l)
        return

if __name__ == ‘__main__‘:
    data = []
    data.append(SimpleObject(‘pickle‘))
    data.append(SimpleObject(‘cPickle‘))
    data.append(SimpleObject(‘last‘))

    try:
        filename = sys.argv[1]
    except IndexError:
        raise RuntimeError(‘Please specify a filename as an argument to %s‘ % sys.argv[0])

    out_s = open(filename, ‘wb‘)
    try:
        # 写入流中
        for o in data:
            print ‘WRITING: %s (%s)‘ % (o.name, o.name_backwards)
            pickle.dump(o, out_s)
    finally:
        out_s.close()

在运行时,该脚本创建一个以在命令行指定的参数为名的文件:

$ python pickle_dump_to_file_1.py test.dat

WRITING: pickle (elkcip)
WRITING: cPickle (elkciPc)
WRITING: last (tsal)

一个在读取结果腌渍对象失败的简化尝试:

try:
    import cPickle as pickle
except:
    import pickle
import pprint
from StringIO import StringIO
import sys

try:
    filename = sys.argv[1]
except IndexError:
    raise RuntimeError(‘Please specify a filename as an argument to %s‘ % sys.argv[0])

in_s = open(filename, ‘rb‘)
try:
    # 读取数据
    while True:
        try:
            o = pickle.load(in_s)
        except EOFError:
            break
        else:
            print ‘READ: %s (%s)‘ % (o.name, o.name_backwards)
finally:
    in_s.close()

该版本失败的原因在于没有 SimpleObject 类可用:

$ python pickle_load_from_file_1.py test.dat

Traceback (most recent call last):
  File "pickle_load_from_file_1.py", line 52, in <module>
    o = pickle.load(in_s)
AttributeError: ‘module‘ object has no attribute ‘SimpleObject‘

正确的版本从原脚本中导入 SimpleObject ,可成功运行。
添加:

from pickle_dump_to_file_1 import SimpleObject

至导入列表的尾部,接着重新运行该脚本:

$ python pickle_load_from_file_2.py test.dat

READ: pickle (elkcip)
READ: cPickle (elkciPc)
READ: last (tsal)

当腌渍有值的数据类型不能被腌渍时(套接字、文件句柄(file handles)、数据库连接等之类的),有一些特别的考虑。因为使用值而不能被腌渍的类,可以定义 __getstate__() 和 __setstate__() 来返回状态(state)的一个子集,才能被腌渍。新式类(New-style classes)也可以定义__getnewargs__(),该函数应当返回被传递至类内存分配器(the class memory allocator)(C.__new__())的参数。使用这些新特性的更多细节,包含在标准库文档中。

环形引用(Circular References)

pickle协议(pickle protocol)自动处理对象间的环形引用,因此,即使是很复杂的对象,你也不用特别为此做什么。考虑下面这个图:

上图虽然包括几个环形引用,但也能以正确的结构腌渍和重新读取(reloaded)。

import pickle

class Node(object):
    """
    一个所有结点都可知它所连通的其它结点的简单有向图。
    """
    def __init__(self, name):
        self.name = name
        self.connections = []
        return

    def add_edge(self, node):
        "创建两个结点之间的一条边。"
        self.connections.append(node)
        return

    def __iter__(self):
        return iter(self.connections)

def preorder_traversal(root, seen=None, parent=None):
    """产生器(Generator )函数通过一个先根遍历(preorder traversal)生成(yield)边。"""
    if seen is None:
        seen = set()
    yield (parent, root)
    if root in seen:
        return
    seen.add(root)
    for node in root:
        for (parent, subnode) in preorder_traversal(node, seen, root):
            yield (parent, subnode)
    return

def show_edges(root):
    "打印图中的所有边。"
    for parent, child in preorder_traversal(root):
        if not parent:
            continue
        print ‘%5s -> %2s (%s)‘ % (parent.name, child.name, id(child))

# 创建结点。
root = Node(‘root‘)
a = Node(‘a‘)
b = Node(‘b‘)
c = Node(‘c‘)

# 添加边。
root.add_edge(a)
root.add_edge(b)
a.add_edge(b)
b.add_edge(a)
b.add_edge(c)
a.add_edge(a)

print ‘ORIGINAL GRAPH:‘
show_edges(root)

# 腌渍和反腌渍该图来创建
# 一个结点集合。
dumped = pickle.dumps(root)
reloaded = pickle.loads(dumped)

print
print ‘RELOADED GRAPH:‘
show_edges(reloaded)

重新读取的诸多节点(译者注:对应图中的圆圈)不再是同一个对象,但是节点间的关系保持住了,而且读取的仅仅是带有多个引用的对象的一个拷贝。上面所说的可以通过测试各节点在pickle处理前和之后的id()值来验证。

$ python pickle_cycle.py

ORIGINAL GRAPH:
 root ->  a (4299721744)
    a ->  b (4299721808)
    b ->  a (4299721744)
    b ->  c (4299721872)
    a ->  a (4299721744)
 root ->  b (4299721808)

RELOADED GRAPH:
 root ->  a (4299722000)
    a ->  b (4299722064)
    b ->  a (4299722000)
    b ->  c (4299722128)
    a ->  a (4299722000)
 root ->  b (4299722064)

原文 pickle and cPickle – Python object serialization - Python Module of the Week 的后半部分。

时间: 2024-10-08 17:37:59

Python 的开发环境的相关文章

用virtualenv建立多个Python独立开发环境

不同的人喜欢用不同的方式建立各自的开发环境,但在几乎所有的编程社区,总有一个(或一个以上)开发环境让人更容易接受. 使用不同的开发环境虽然没有什么错误,但有些环境设置更容易进行便利的测试,并做一些重复/模板化的任务,使得在每天的日常工作简单并易于维护. 什么是virtualenv? 在Python的开发环境的最常用的方法是使用 virtualenv 包. Virtualenv是一个用来创建独立的Python环境的包.现在,出现了这样的问题:为什么我们需要一个独立的Python环境? 要回答这个问

转-在Mac OS上搭建Python的开发环境

在Mac OS上搭建Python的开发环境 本文转载自:http://www.jb51.net/article/76931.htm 一. 安装python mac系统其实自带了一个python的执行执行环境,用来运行python还行,但是开发可能就不够了,因此我们需要重新安装python.这里有两种方案安装: 1.homebrew 1 brew install python 这个方案比较简单,如果出错的话可以给前面加sudo试试,这个安装的python可能不是最新版. 2.从官网下载安装大家可以

用virtualenv建立多个Python独立开发环境(转)

原文:http://www.nowamagic.net/academy/detail/1330228 不同的人喜欢用不同的方式建立各自的开发环境,但在几乎所有的编程社区,总有一个(或一个以上)开发环境让人更容易接受. 使用不同的开发环境虽然没有什么错误,但有些环境设置更容易进行便利的测试,并做一些重复/模板化的任务,使得在每天的日常工作简单并易于维护. 什么是virtualenv? 在Python的开发环境的最常用的方法是使用 virtualenv 包. Virtualenv是一个用来创建独立的

Win 8配置python集成开发环境(Eclipse Mars.1 (4.5.1) Release + python + pydev)

之前有一篇写的是mac 配置Python集成开发环境(Eclipse +Python+Pydev),在2016年来临之际,我打算给我的Windows系统也安装上python的集成开发环境,虽然工作中很少用到python但是我真的喜欢python. 但是在eclipse的官方网站下载最新版本Eclipse Mars.1 (4.5.1) Release,进行安装.安装包启动界面如下: 和以前的安装界面是有差别的,研究了一下我认为是分包处理了,不同的需求安装不同的包,但是有一个公共的插件包,是我们需要

【转】windows和linux中搭建python集成开发环境IDE

http://blog.csdn.net/pipisorry/article/details/39854707 使用的系统及软件Ubuntu / windowsPython 2.7 / python 3Pycharm 2.6.3Openjdk Postgresql 9.1VirtualenvVirtualenvwrapper{开始之前,可以给系统做一下备份.如误安装了Postgresql,出现了大问题就不得不把系统给重装了} 安装python 安装python 1. Ubuntu 12.04系统

在Mac OSX系统中搭建Python集成开发环境

本篇博客分享如何在Mac OSX系统中搭建Python集成开发环境 首先到Python官网下载python,python官网链接 这里选择下载Python2.7.9版本,下载完成之后安装: 安装成功,打开终端: 下面下载python开发的ide,http://www.jetbrains.com/pycharm/ 下载专业版,有30天的免费试用,足够我们学习python了. 安装,将Pycharm拖动到mac应用程序中 创建第一个Python项目: 运行python文件

python(pyqt)开发环境搭建

eric+pyqt 安装(python开发工具) 更多 0 Python python Eric是一个开源的.跨平台的python&ruby集成开发环境,基于python和pyqt运行.eric有以下特点 1.跨Windows/Linux/Mac等开台 2.调试器给力.支持设置断点,单步调试,查看变量值. 3.支持工程. 4.支持自动补全. 5.支持智能感知,即输入变量名和一个点,会自动提示可能的函数. 6.自动语法检查.每次保存时自动检查. 7.支持自动缩进,会自动判断if, while等语句

《Python入门》Linux 下 Python Web开发环境搭建笔记

之前写过 Windows 7下Python Web开发环境搭建笔记,今天写一下在Linux系统下搭建Python Web的开发测试环境. 我使用的系统是:ubuntu 14.04 server,根据个人经验,CentOS 6.5 下也适用. 关于Python的版本 进入Python的网站,鼠标移到导航条上的下载,我们会发现提供两下主版本的下载链接! 这两个之间存在什么差别呢? 个人理解,2.7.x的版本为更加稳定的版本,而3.x的版本则是比较前卫的版本,包含了很多新功能新特性之类的: 但如果想要

windows下python web开发环境的搭建

windows下python web开发环境: python2.7,django1.5.1,eclipse4.3.2,pydev3.4.1 一. python环境安装 https://www.python.org/ftp/python/2.7/python-2.7.amd64.msi 不多说,装完后把C:\Python27加入到path环境变量里. 然后就溜溜python,看看version啦.OK,next step. 二. python web开发框架django安装 django是一个采用

centos6.5下Python IDE开发环境搭建

自由不是想做什么就做什么,而是想不做什么就不做什么.        ---摘抄于2016/11/30晚 之前学习了一段时间的Python,但所有部署都在windows上.正赶上最近在学习liux,以后Python的继续学习就基于linux了,随便写写记录自己的学习点滴.废话不多说,上大招: 毛主席说过,没有开发环境的Python开发都是耍流氓. [Python安装] 1.gcc自然少不了,图个方便,直接用"Development Tools": yum groupinstall &qu