Python中的__main__函数

Posted in 2016-12-14 13:30 | Category: Python | Tags: python

Table of Contents

__main__

转自 这里

很多新手刚开始学习python的时候经常会看到python 中 name = 'main' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中 name = 'main' 的作用,到底干嘛的?

有句话经典的概括了这段代码的意义:

“Make a script both importable and executable”

意思就是说让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可执行。 这句话,可能一开始听的还不是很懂。下面举例说明: 先写一个模块:

#module.py
def main():
    print("we are in %s" % __name__)

if __name__ == '__main__':
    main()

这个函数定义了一个main函数,我们执行一下该py文件发现结果是打印出

we are in __main__

说明我们的if语句中的内容被执行了,调用了 main(): 但是如果我们从另我一个模块导入该模块,并调用一次main()函数会是怎样的结果呢?

#anothermodle.py
from module import main
main()

其执行的结果是:

we are in module

但是没有显示

"we are in __main__"

也就是说模块 name = 'main' 下面的函数没有执行。 这样既可以让“模块”文件运行,也可以被其他模块引入,而且不会执行函数2次。这才是关键。

总结一下:

如果我们是直接执行某个.py文件的时候,该文件中那么

__name__ == '__main__'

True, 但是我们如果从另外一个.py文件通过import导入该文件的时候,这时name = 'main'的值就是我们这个py文件的名字而不是name = 'main'。 这个功能还有一个用处:调试代码的时候,在

if __name__ == '__main__'

中加入一些我们的调试代码, 我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!

sqlalchemy序列化为json

Posted in 2016-12-13 7:53 | Category: Python | Tags: flask sqlalchemy python

为什么需要这个需求?

sqlalchemy 是个好东西,虽然其文档犹如老太婆的裹脚布--又臭又长,饱受诟病

使用 restful 时sqlalchemy返回的是一个 object 类,假设前后端分离,前端无法处理

如何实现?

直接给出代码

class Serializer(object):

    def __init__(self, instance, many=False, include=[], exclude=[], depth=2):
        self.instance = instance
        self.many = many
        self.include = include
        self.exclude = exclude
        self.depth = depth

    @property
    def data(self):
        if self.include and self.exclude:
            raise ValueError('include and exclude can\'t work together')
        if self.many:
            if isinstance(self.instance, list):
                return self._serializerlist(self.instance, self.depth)
            pageinfo = {
                'items': True,
                'pages': self.instance.pages,
                'has_prev': self.instance.has_prev,
                'page': self.instance.page,
                'has_next': self.instance.has_next,
                'iter_pages': list(self.instance.iter_pages(left_edge=1,
                                                            left_current …

flask使用token进行验证

Posted in 2016-12-13 3:32 | Category: Python | Tags: flask python token

为什么需要用token验证

原因呢是因为写博客时已经在本地写好了,但是要发表到网站上还需要这么几步:

  • [X] 打开浏览器
  • [X] 打开我的网站
  • [X] 进入登陆页
  • [X] 登陆
  • [X] 进入后台页
  • [X] 进入文章发表页
  • [X] 复制粘贴
  • [X] 发表

所以使用token验证成为必然

如何使用token?

生成token

使用itsdangerous对token进行加密

class User(model):
    ......

    @property
    def token(self):
        config = current_app.config
        secret_key = config.setdefault('SECRET_KEY')
        salt = config.setdefault('SECURITY_PASSWORD_SALT')
        serializer = URLSafeTimedSerializer(secret_key)
        # column = self.(需要加密的字段)
        token = serializer.dumps(column, salt=salt)
        return token

请保管好SECRET_KEYSECURITY_PASSWORD_SALT,不要泄露

验证token

class User(Model):
    ......

    @staticmethod
    def check_token(token, max_age=86400):
        config = current_app.config
        secret_key = config.setdefault('SECRET_KEY')
        salt = config.setdefault('SECURITY_PASSWORD_SALT')
        serializer = URLSafeTimedSerializer(secret_key)
        try:
            column = serializer.loads(token, salt=salt, max_age=max_age)
        except BadSignature:
            return False
        except SignatureExpired:
            return False
  • max-age 最大过期时间 …

利用网易云api获取歌曲信息

Posted in 2016-12-11 4:4 | Category: Python | Tags: python

最近是增加了一个aplayer在网站上,但原本想要使用qiniu存储,最后觉得太麻烦了,直接利用网易云api获取歌曲

使用python标准库urllib

直接给出代码

from urllib import request
import json

id = '28819878'
url = "http://music.163.com/api/song/detail/?id=" + id + "&ids=%5B" + id + "%5D&csrf_token"
rep = request.urlopen(url).read().decode('UTF-8')
rep = json.loads(rep)['songs'][0]
name = rep['name']
artist = rep['artists'][0]['name']
mp3url = rep['mp3Url']
picurl = rep['album']['blurPicUrl']
print('name:', name)
print('artists:', artist)
print('mp3:', mp3url)
print('pic:', picurl)
url = 'http://music.163.com/api/song/media?id=' + id
rep = request.urlopen(url).read().decode('UTF-8')
lyric = json.loads(rep)['lyric']
print('lyric:\n', json.dumps(lyric))

结果

#+RESULTS:
: name: 轨迹
: artists: 徐小薇
: mp3: http://m2.music.126.net/1vGFlmmY1NeHEZy_1QuYhA==/5898879883333738.mp3
: pic: http://p4.music.126.net/EMS4GE-ojql3azwxXYPT3w==/3264450024433079.jpg
: lyric:
:  "[00:12.98 …

论朝鲜半岛核危机

Posted in 2016-12-4 8:29 | Category: 生活随笔 | Tags: 生活随笔 朝鲜半岛 核危机

最近大学里的最后一节形式与政策结束了,虽然我一直在外实习,没怎么回去上过课,但论文还是要写的

见识有限,有不对之处,敬请谅解,并且欢迎给我提出意见

没想到大学里最后一节课就这样过去了,唉

duilib属性列表

Posted in 2016-11-25 2:42 | Category: Windows | Tags: windows duilib

duilib属性列表

地址: duilib

Duilib 是一款强大的界面开发工具,可以将用户界面和处理逻辑彻底分离,极大地提高用户界面的开发效率。

nsis打包好累

记录一下

``` <?xml version="1.0" encoding="UTF-8"?>

    <Attribute name="visiblefolderbtn" default="true" type="BOOL" comment="是否显示展开与收缩按钮对象"/>
    <Attribute name="visiblecheckbtn" default="false" type="BOOL" comment="是否显示复选框对象"/>
    <Attribute name="itemminwidth" default="0" type="UINT" comment="设置Item的最小宽度,当hscrollbar为真且itemminwidth大于TreeView宽度时才会显示横向滚动条"/>
    <Attribute name="itemtextcolor" default="0x00000000" type="DWORD" comment="item文本颜色"/>
    <Attribute name="itemhottextcolor" default="0x00000000" type="DWORD" comment="鼠标进入item时文本颜色"/>
    <Attribute name="selitemtextcolor" default="0x00000000" type="DWORD" comment="item被选中时文本颜色"/>
    <Attribute name="selitemhottextcolor" default="0x00000000" type="DWORD" comment="item被选中时且鼠标进入时的文本颜色"/>
</TreeView>
<TreeNode parent="ListContainerElement" notifies="setfocus killfocus timer itemactivate itemclick itemexpanded itemcollapsed windowinit(root)">
    <Attribute name="name" default="" type="STRING" comment="控件名字,同一窗口内必须唯一,如(testbtn)"/>
    <Attribute name="pos" default="0,0,0,0" type="RECT" comment="位置,如果为float控件则指定位置和大小,否则只指定大小,如(0,0,100,100)"/>
    <Attribute name="padding" default="0 …

常用正则表达式

Posted in 2016-11-25 2:42 | Category: Python | Tags: python regex

世界总是充满杯具

Posted in 2016-10-17 13:5 | Category: 生活随笔 | Tags: 随意写写 生活随笔

独自旅行的杯子

<2017-10-20 五 18:53>

世界总是充满杯具,正如陪伴了我大学三年多的水杯,独自坐上了开往广州的火车,离我而去

:运动是相对的

忘记背包的英文

世界总是充满杯具,正如帮助一名忘记拉上背包拉链的外国友人,"Your…Your"了半天,最后一句"I help you"换来的却是一句中文的"谢(sei)谢(sei)"

: 背包 backpack

错过的火车

<2017-10-23 一 18:58>

世界总是充满杯具,正如那错过的火车,刚到月台,火车刚开走,只要再给我30s,不,就20s······

: 结果坐上了左边的动车(我买的可是高铁票)

常用代码片段

Posted in 2016-10-17 13:5 | Category: Coding | Tags: python

得到当天0点时间

today = datetime.datetime.today()
b = datetime.datetime(today.year, today.month, today.day, 0, 0, 0)
print(b)

now = time.time()
midnight = now - (now % 86400) + time.timezone
itime = time.ctime(midnight)
print(itime)

python时间或时间戳与字符串转换

#把datetime转成字符串
def datetime_toString(dt):
    return dt.strftime("%Y-%m-%d-%H")

#把字符串转成datetime
def string_toDatetime(string):
    return datetime.strptime(string, "%Y-%m-%d-%H")

#把字符串转成时间戳形式
def string_toTimestamp(strTime):
    return time.mktime(string_toDatetime(strTime).timetuple())

#把时间戳转成字符串形式
def timestamp_toString(stamp):
    return time.strftime("%Y-%m-%d-%H", time.localtime(stamp))

#把时间戳转成datetime
def timestamp_toDatetime(stamp):
    return datetime.fromtimestamp(stamp …

我的linux常用软件

Posted in 2016-10-5 17:31 | Category: Linux | Tags: linux archlinux 生活随笔

桌面环境

  • xfce4 安装系统后首先安装的桌面环境
  • i3wm 主要的桌面环境,习惯了平铺,非平铺用不习惯了
  • dmenu i3wm快速启动程序

输入法

  • fcitx linux下输入法
  • fcitx-cloudpinyin
  • fcitx-sunpinyin
  • fcitx-configtool fcitx配置

网络浏览

  • google-chrome 默认浏览器
  • firefox 备用

系统代理

  • proxychains-ng 终端系统代理

文本编辑

  • emacs 主要代码编辑器兼文件管理器兼图片浏览器
  • vim 偶尔使用

编程相关

  • pycharm 偶尔进行代码调试时使用,毕竟申请了学生key
  • pgadmin3 postgresql的图形化工具
  • wireshark 抓包工具
  • sqlmap sql注入
  • sqlite manager firefox插件
  • gcc
  • g++
  • jre8-openjdk

文件管理

  • thunar xfce4的默认文件管理器
  • ranger python所写的终端文件管理器,操作与vim类似
  • dired emacs的自带文件管理
  • find 文件查找
  • gvfs
  • ntfs-3g 挂载windows分区
  • gvfs-mtp 安卓手机连接

文件压缩及解压缩

  • tar
  • zip
  • unzip
  • unrar
  • p7zip
  • xarchiver 压缩解压缩的图形化界面
  • thunar-archive-plugin thunar,右键菜单插件

图片编辑及浏览

  • gimp 对图片进行一些简单的修改(类PS)
  • feh 简单的图片浏览器,主要用来设置i3wm的壁纸

链接下载

  • wget 绝大多数链接下载
  • bcloud 百度云linux版,可惜无法使用了
  • DownThemAll firefox的一个下载插件
  • 迅雷 在virtualbox虚拟机中使用

桌面美化

  • conky 推荐使用conky-colors
  • wqy-microhei 文泉驿字体
  • deepin-gtk-theme …

nsis使用

Posted in 2016-9-28 11:12 | Category: Windows | Tags: windows8 windows nsis

图标相关

图标格式大小要求

  • 安装程序图标: 大小: 32x32 格式: .ico
  • 卸载程序图标: 大小: 32x32 格式: .ico
  • 程序安装背景: 大小: 164x314 格式: .bmp

设置图标

  • 安装图标与卸载图标

    • 直接在新建向导中设置
    • 修改代码

      MUI Settings

      !define MUI_ABORTWARNING
      !define MUI_ICON "C:\Users\JiangLin\Desktop\CameraStreamer\1.ico"
      !define MUI_UNICON "C:\Users\JiangLin\Desktop\CameraStreamer\2.ico"
      !define MUI_WELCOMEFINISHPAGE_BITMAP "C:\Users\JiangLin\Desktop\CameraStreamer\2.bmp"
      
      • 安装背景

      !define MUI_WELCOMEFINISHPAGE_BITMAP "C:\Users\JiangLin\Desktop\CameraStreamer\2.bmp"

创建快捷方式图标

CreateShortCut "$DESKTOP\CameraStreamer.lnk" "$INSTDIR\CameraStreamer.exe" "" "$INSTDIR\3.ico"

*注意:* 不要漏了

""

程序和功能页面卸载图标

WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\CameraStreamer.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString …

pip安装mysql-python出错

Posted in 2016-9-28 11:7 | Category: Python | Tags: pip python mysql

Table of Contents

Collecting mysql-python
  Using cached MySQL-python-1.2.5.zip
    Complete output from command python setup.py egg_info:
    sh: mysql_config: 未找到命令
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-build-g21LDi/mysql-python/setup.py", line 17, in <module>
        metadata, options = get_config()
      File "setup_posix.py", line 43, in get_config
        libs = mysql_config("libs_r")
      File "setup_posix.py", line 25, in mysql_config
        raise EnvironmentError("%s not found" % (mysql_config.path,))
    EnvironmentError: mysql_config not found

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-g21LDi/mysql-python/

Mac

参考问题

brew install mysql
export PATH=$PATH:/usr/local/mysql/bin
pip install MySQL-Python

Centos

yum install python-devel mysql-devel

Mysql无法启动

Posted in 2016-9-28 10:55 | Category: Linux | Tags: linux mysql

[root@localhost]# systemctl restart mysqld
Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.

[root@localhost]# systemctl status mysqld
● mysqld.service - SYSV: MySQL database server.
   Loaded: loaded (/etc/rc.d/init.d/mysqld)
   Active: failed (Result: exit-code) since 二 2016-09-13 14:05:27 CST; 16s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 13732 ExecStart=/etc/rc.d/init.d/mysqld start (code=exited, status=1/FAILURE)

9月 13 14:05:26 localhost.localdomain systemd[1]: Starting SYSV: MySQL datab...
9月 13 14:05:27 localhost.localdomain mysqld[13732]: MySQL Daemon failed to ...
9月 13 14:05:27 localhost.localdomain mysqld[13732]: Starting mysqld:  [FAILED]
9月 13 14:05:27 localhost.localdomain systemd[1]: mysqld.service …

emacs解决中英文表格对齐

Posted in 2016-8-14 15:42 | Category: Linux | Tags: linux emacs org-mode

为什么要解决?

其实也没什么,主要是中英文表格不对齐的话太难看,不直观,外加强迫症

首先来预览一下未对齐之前与之后的效果:

未对齐的

algin

对齐的 align

怎么解决?

之前我用网上搜索到的,分别设置英文字体和中文字体

;; 中英文表格对齐
(set-default-font "Dejavu Sans Mono 10")
(if (and (fboundp 'daemonp) (daemonp))
    (add-hook 'after-make-frame-functions
              (lambda (frame)
                (with-selected-frame frame
                  (set-fontset-font "fontset-default"
                                    'unicode "WenQuanyi Micro Hei Mono 11"))))
  (set-fontset-font "fontset-default" 'unicode "WenQuanYi Micro Hei Mono 11"))
;; 这里是因为默认英文字体太小,所以进行等比例放大
(setq face-font-rescale-alist '(("Dejavu Sans Mono" . 1.1) ("WenQuanyi Micro Hei Mono"  . 1.32)))
;; (setq face-font-rescale-alist '(("Dejavu Sans Mono" . 1.15) ("WenQuanyi Micro Hei Mono"  . 1.38)))

这样虽然可以对齐了,但是如果我以 daemon 启动,字体会变得很大,而且显示效果相当不舒服

所以,自己摸索了一下,得到如下结果

(if (and (fboundp 'daemonp) (daemonp))
    (add-hook 'after-make-frame-functions
              (lambda (frame)
                (with-selected-frame frame
                  (set-face-font 'org-table "-Misc-Fixed-normal-normal-normal-*-18-*-*-*-c-90-iso10646-1")
                  )))
  (set-face-font 'org-table "-Misc-Fixed-normal-normal-normal-*-18-*-*-*-c-90-iso10646-1"))

这样单独设置 org-table 的字体,在非 org-table 的字体为默认设置

python的匿名函数lambda

Posted in 2016-8-13 11:20 | Category: Python | Tags: python lambda

参考文档

lambda arguments: expression

等于

def <lambda>(arguments):
    return expression

举例

def add(a,b):
    return a + b
print(add(1,3))

可以写成这样

add = lambda a,b:a+b
print(add(1,3))

从上可以看出 lambda 的语法

lambda [arg1[,arg2,arg3....argN]]:expression