Shawn's Blog

一个伪程序员的伪技术博客

我们在编写Python程序的时候会发现在我们的目录中可能会出现与源代码同名的pyc文件生成,比如有一个源码文件是hello.py那么可能会生成一个hello.pyc文件出来.这个pyc文件是Python的字节码文件,就类似于Java中的hello.class一样.

Python虽然是解释性语言,但还是可以有一个编译的过程,只不过是编译成字节码文件罢了.如果我们的源码带有包含关系,比如源码a.py里面import了源码文件b.py,那么在执行python a.py的时候就会将b.py编译成b.pyc

下次再运行python a.py的时候解释器会检查b.pyb.pyc的修改时间,如果一致就代表源码没有修改过,那么就可以直接调用b.pyc来更快的执行程序,如果时间不同那就证明b.py被修改过,则会重新编译b.py

其中pyc文件的主要作用是用来加快程序执行速度的,虽然编译出来的pyc是二进制文件,不能看到内部的内容,但是还是不要把这种方式作为保护源码的方法.因为这种pyc文件是可以轻易被反编译的,有很多开源库可以轻松的反编译pyc文件,甚至都有web程序来反编译pyc文件,比如这个tool.lu就可以通过上传文件pyc文件的方式反编译.

0X00 使用uwsgi启动Django

首先安装uwsgi,pip install uwsgi就可以装好.然后找到Django生成的wsgi.py文件,这文件通常实在与项目名同名的app目录下的,比如我的项目名为django_test那么这个文件应该就在django_test/wsgi.py.然后执行uwsgi --http 0.0.0.0:8080 --wsgi-file django_test/wssgi.py就可以用uwsgi启动你的Django项目了.
Django自带的python manage.py runserver用于调试还是可以的,不过如果用于生产环境的不论是安全性还是性能都不足以满足生产环境的需要.

0X01 使用supervisor维持服务在线

我们知道由于Linux系统的进程管理机制,导致在bash里启动的程序如果退出bash就会自动被kill掉.所以我们需要一个能让进程一直活下去的方法,其中nohup是我们常用的方法,不过这种方法也只是能让进程活在后台罢了,平时跑个脚本或是其他小程序还可以,如果是部署一个服务的话就不合适了.这里我们选用supervisor来维持服务.

阅读全文 »

0X00 安装fabric

使用pip可以轻松地安装fabric

1
pip install fabric

0X01 初次调用

在当前目录下创建一个名为fabfile.py的文件,填写文件内容如下:

1
2
3
4
5
6
# coding=utf-8
import fabric


def test():
print 'hello,world'

然后在当前目录下执行命令fab test就可以看到一条hello,world输出了。

0X02 浅显的道理

根据上面简单的例子可以看出来fab命令执行的时候会默认找到当前目录下的fabfile.py文件,找到后会用fab命令的参数去匹配fabfile.py中的函数名,执行相应的功能。

实际上当前目录可以没有fabfile.py,如果当前目录的上级目录中有fabfile.py是会采用上级目录中的fabfile.py的。而且文件名也不一定用fabfile.py,假设取了一个名为asdf.py的文件,那么只需要执行fab -f asdf.py就可以采用这个fabfile了。

阅读全文 »

0X00 可迭代对象

Python中的列表,元组,字典,文件都是可迭代对。可迭代对象简单地说就是可以用for i in xxx:来遍历的对象。

1
2
3
4
5
6
7
8
9
10
my_list = [1, 2, 3, 4, 5, 6, 7]
for i in my_llist:
print i

my_dict = {
'a': u'苟利国家生死以',
'b': u'岂因祸福避趋之'
}
for i in my_dict:
print i

不过如果数据量非常非常庞大的时候,会很影响程序的性能。这种时候就可以使用生成器来解决这个问题。

0X01 生成器

生成器的用法和普通的可迭代对象差不多,最大的特点就是:“用的时候才去计算”。这里写一个简单的例子,演示一下情况。第一种生成超大列表的方式要逐项计算完才算弄出来了这个10000长的列表,而后者是生成器,只是声明了怎么算,并没有真的去算,所以在速度上才是完全不能比的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env python
# coding=utf-8

import time

if __name__ == '__main__':
start = time.time()
[x**x for x in range(10000)] # 这里生成的是一个超大的列表
end = time.time()
print end - start

start = time.time()
(x**x for x in range(10000)) # 这里生成一个超大的生成器(注意看,括号不一样)
end = time.time()
print end - start

运行结果如下:

1
2
3
shawn in ~ λ python hello.py
6.76475715637
0.000135898590088
阅读全文 »

0X00 怎样正确使用分支

通常情况下一个git仓库要保持三个及以上的分支,基本的分支明明如下:

name function
master 正常运行的稳定版本
develop 正常运行的开发版
feature 添加新功能的分支
hotfix 紧急修复bug的分支

如果你已经fork了一份代码到自己本地,当你想添加一个新功能比如「用户管理」的时候,就应该先换到develop分支,然后由这个分支创建一个新的名为feture_add_usermanager的分支。在新分支里编写代码后将代码提交一个PullRequest到自己的develop分支,合并起来后再提交一个PullRequest到团队的仓库中,等待团队其他成员review后就可以正式将代码合并到团队的develop中了。等下一次发布新版本的时候就可以将团队的develop分支合并到团队的master分支中了了。

如果中途项目出现了严重bug(不能登录)需要即使修改上线,那就从自己的master分支上新建一个名为hotfix_cantlogin的分支,修改完后直接提交PullRequest到团队的master分支,review且合并后就可以将该分支删除了。

阅读全文 »
0%