利用setuptools的entry_point参数实现模块动态导入

2015年7月06日 14:34

setuptools提供了entry_points参数,允许在安装时,动态导入模块. 下面是简单示例.
  • 目录结构  
建立如下文件
➜  book  tree
.
├── book
│   ├── add.py
│   ├── __init__.py
│   ├── remove.py
│   └── update.py
└── setup.py
  • add.py内容  
remove.py、update.py与add.py相同
def make():
    print "add"
  • setup.py内容
from setuptools import setup, find_packages

setup(
    name = "book",
    version = "0.1",
    packages = find_packages(),
    entry_points={
        "book":[
            "add=book.add:make",  #add=模块:函数/类
            "update=book.update:make",
            "remove=book.remove:make",
        ]
    }
)
  • 编译成egg包
python setup.py bdist_egg
  • 安装到系统路径  
上面编译命令可以不用,直接用install安装
python setup.py install
  • 用法
from pkg_resources import iter_entry_points

for r in iter_entry_points("book"):
    m = r.load()
    m()
 

Tags: 模块化
评论(281) 阅读(23879)

apscheduler如何传递参数给job

2015年7月03日 10:17

import tornado
from apscheduler.schedulers.tornado import TornadoScheduler
sched = TornadoScheduler()


def job1(a, b, c):
    print "job1:", a,b,c


def job2(a, b, c):
    print "job2:", a,b,c

sched.add_job(job1, 'interval', seconds=1, args=["a", "b", "c"])
sched.add_job(job2, 'interval', seconds=1, kwargs={"a": "a", "b": "b", "c": "c"})
sched.start()

tornado.ioloop.IOLoop.instance().start()

Tags: apscheduler
评论(3) 阅读(8552)

apscheduler定时任务

2015年6月30日 16:50

使用apscheduler定时任务,可以使用interval任务+cron任务,interval定时更新cron配置信息,cron则实现作业计划。

通常用法

from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()

def my_job():
    print 'hello world'

# 使用修饰器
@sched.scheduled_job('cron', id='my_job_id', second=10)
def hello():
    print "hello decorate"

# 轮循
sched.add_job(my_job, 'interval', seconds=5)
# 定时计划
sched.add_job(my_job, 'cron', second=5, minute=1, hour=12, day_of_week=2)
sched.start()

在tarnado中用法

import tornado
from apscheduler.schedulers.tornado import TornadoScheduler
sched = TornadoScheduler()

def my_job():
    print sched.get_jobs()

sched.add_job(my_job, 'interval', seconds=5, id="1")
sched.start()

tornado.ioloop.IOLoop.instance().start()

任务触发器比较

很多情况下,任务是根据数据库调整触发时间,时间改变了,如何判断触发器是否变化?
生成新trigger然后,专程字符串比较比较
# 触发器比较
str(job.trigger) != str(trigger)
# 修改触发器
sched.reschedule_job(job.id, trigger=trigger)
 

Tags: apscheduler
评论(3) 阅读(8532)

什么是经验

2015年6月29日 11:14

    经是准则,道之常者;验是验证。通过亲身验证而掌握的准则,称为经验。工作经验、人生经验中如果不包含准则,只能称为心得体会。

    程序员这个行业最多五十年,真有准则吗? 假如一条规则寿命是五十年,可用一生,对我而言它可以称为准则。五十多年、无数科学研究,成果在哪里,有这样成果吗?当然有!

评论(1) 阅读(1805)

spf13无法输入中文

2015年6月29日 10:14

为gvim安装spf13后,发现无法输入中文,原因是ibus的下拉提示与spf13的下拉提示冲突。最理想的解决办法是spf13下拉提示能够判断输入法状态,处在英文状态用spf13的下拉提示,处在中文状态用ibus下拉提示.
但是不可行。下面是我选择使用fcitx输入法解决这个问题.
  • 安装
sudo yum install fcitx*
sudo yum install im-chooser
  • 设置快捷键
fcitx-configtoool
  • gsettings配置
gsettings set org.gnome.settings-daemon.plugins.keyboard active false
  • 开机设置  
在im-chooser中选择使用fcitx
im-chooser
 

Tags: spf13
评论(41) 阅读(2272)

python动态加载是否影响性能

2015年6月06日 16:39

  • 说明
看见这个标题觉得有些好笑。受先入为主观念影响,心里隐约觉得动态加载有点慢,最近受一些启发,开始思考java反射、python动态加载的性能问题. 下面是测试python不同加载方式的性能
  • 示例
有m1.py m2.py m3.py三个文件,内容如下
class Test:
    def func(self):
        pass
测试主体
#encoding=utf-8
import time
import importlib
import m1
from m3 import Test as m3_Test

class Test:
    def func(self):
        pass

def main():
    #A import
    nums = range(1, pow(10, 7))
    start = time.time()
    for i in nums:
        m1.Test()
    end =  time.time()
    print "%sms" % (( end - start ) * 1000)

    #B import_module
    im = importlib.import_module("m2")
    start = time.time()
    for i in nums:
        im.Test()
    end = time.time()
    print "%sms" % ((end - start) * 1000)
    #C from import
    start = time.time()
    for i in nums:
        m3_Test()
    end = time.time()
    print "%sms" % ((end - start) * 1000)

    #D 当前类
    start = time.time()
    for i in nums:
        Test()
    end = time.time()
    print "%sms" % ((end - start) * 1000)

if __name__ == "__main__":
    main()
    '''
    结果
        1619.62890625ms
        1586.80582047ms
        1359.44890976ms
        1369.25506592ms
    '''
  • 结论
可以得到几点结论:
  1. A与B比较: 动态加载并不会慢
  2. A与C比较: 通过from减少导入内容,可以加快载入速度
python本身就是动态语言,动态加载不会对性能产生影响,所以,尽管用,这是非常好的一个特性.
 

Tags: 反射
评论(44) 阅读(3392)

与python内建函数重名

2015年6月06日 15:43

自定义函数与内建函数重名,又不想改为,怎么办?加前缀.
 
例如:list可以使用__builtin__.list区分
import __builtin__

def list(f):
    '''
    将返回结果转为list
    '''
    def __call(*args, **kwargs):
        return __builtin__.list(f(*args, **kwargs))
    return __call
 

评论(7) 阅读(2826)

django如何使用restful风格

2015年6月06日 15:24

个人比较喜欢restful风格,以为django要安装rest framework才支持restful. 偶然发现只需继承View类即可.
 
from django.views.generic import View

class TaskView(View):
    # 获取
    def get(self, request, *args, **kwargs):
        print request.GET
    # 新建
    def post(self, request, *args, **kwargs):
        print request.POST
    # 更新
    def put(self, request, *args, **kwargs):
        print request.body
    # 删除
    def delete(self, request, *args, **kwargs):
        print request.body

# 路径配置
#url(r'task/$', TaskView.as_view())
 

Tags: python
评论(2) 阅读(2169)

开机时让chrome打开指定网页

2015年6月02日 14:03

每天需要登oa系统打卡,经常会忘记,怎么办?弄了个脚本,在开机时,自动弹出oa系统.
  • 示例
下面是个bat脚本,放在win8的开机启动目录中
::开机启动目录 C:\Users\wangyq\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --pinned-tab-count=1 www.baidu.com
  • 参数
--pinned-tab-count=x url1 url2 … urlx
* x 是想要开启的pinned tab数目
* url1,url2,urlx是对应打开的页面网址

Tags: chrome
评论(1) 阅读(4714)

pymode导致vim保存py文件很慢

2015年5月25日 12:06

  • 问题
vim安装pymode插件后,保存py文件, 出现vim卡住了,vim底部提示"pymode regenerate auto import cache".
  • 解决
在.vimrc中添加配置关闭自动构建
" 当前目录文件很多时,会导致第一次保存非常慢
call pymode#default('g:pymode_rope_autoimport', 0)

如果还没有效果,再加上

let g:pymode_rope = 0 

评论(206) 阅读(6312)