标签归档:Python

编译static的Python及自带的相关module

非 static 编译

不指定额外参数直接编译 Python:

$ ./configure
$ make

查看所依赖的共享库:

$ ldd python
    linux-vdso.so.1 =>  (0x00007fffcd95a000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fab5c350000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fab5c140000)
    libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007fab5bf20000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fab5bc10000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fab5b840000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fab5c600000)

static 编译

以简单的方式使用GDB调试Python程序

先决条件

本文演示环境

# python版本: 2.7
# python内带GDB版本: 2.7  影响使用自定义的Python命令
$ gdb  # 进入GDB环境
(gdb) python-interactive  # 进入GDB内带的Python环境
>>> import sys
>>> sys.version  # 查看内带Python版本 如果需要使用其它Python版本需要自行编译GDB

# 或者
$ readelf -d $(which gdb) | grep python
 0x0000000000000001 (NEEDED)             Shared library: [libpython3.5m.so.1.0]  

Shadowsocks源码阅读笔记【1】——语言相关

1.Python版本信息:

>>> import sys
>>> sys.version_info
sys.version_info(major=2, minor=7, micro=6, releaselevel='final', serial=0)

2.getopt.getopt(args, options[, long_options])进行命令行参数解析。

3.json.load(f, object_hook=_decode_dict)自定义JSON解码。

4.string.maketrans(from, to)构建字符映射转换表(长度为256):

>>> import string
>>> from_chars = 'abcdefg'
>>> to_chars = '1234567'
>>> table = string.maketrans(from_chars, to_chars)

Python中JSON在解析的同时进行自定义编码处理

在对文件内容或字符串进行JSON反序列化(deserialize)时,由于原始内容编码问题,可能需要对反序列化后的内容进行编码处理(如将unicode对象转换为str)。

在Python中,一种方式是先使用json.loadjson.loads反序列化得到dict对象,然后对这个dict对象进行编码处理。

但其实在json.loadjson.loads中,有可选参数object_hook。通过使用此参数,可以对反序列化得到的dict直接进行处理,并使用处理后新的dict替代原dict返回。

使用方法为:

d = json.loads(json_str, object_hook=_decode_dict)

附Shadowsocks中使用的_decode_dict_decode_list

def _decode_list(data):
    rv = []
    for item in data:
        if isinstance(item, unicode):
            item 

C语言及Python命令行参数解析 – getopt

在编写各种命令行程序甚至是GUI程序时,经常需要对命令行参数进行解析处理,以控制程序的执行。当只需要按顺序处理各参数时,可以通过简单地遍历各参数实现。如果要处理稍复杂的命令行参数,则可以使用短选项参数(-a-a arg)与长选项参数(--name--name=arg)。注:短选项-abc-a -b -c等同。

在C语言中,对于短选项参数可以使用getop函数。下面代码摘自http://en.wikipedia.org/wiki/Getopt

#include <stdio.h>     /* for printf */
#include <stdlib.h>    /* for exit */
#include <unistd.h>    /* for getopt */

int 

Python中的字符串编码(Encode)与解码(Decode)

强烈推荐文章 Pragmatic Unicode:http://nedbatchelder.com/text/unipain.html


Unicode:一套字符编码方案,为各字符定义一个对应的码位(Code Point)。可简单理解为,一个包含了各种字符及与各字符相关联整数值的映射表(实际上还包含其它信息),表中的每一个条目为 <字符, 整数值> 对。注意,Unicode本身并不规定字符应当如何以二进制形式进行存储。

UTF-8:Unicode编码方案的具体实现之一(还有 UTF-16、UTF-32 等,UTF 为 Unicode Transformation Format 的编写),描述了如何将各字符以二进制进行存储。UTF-8为非定长编码实现,对于不同的字符,其用于二进制存储的字节个数为 1-6 个。如果将Unicode中字符对应码位的整数值形式与UTF-8编码中字符的整数值形式比较,它们并不一定相同。UTF-8 编码内部不含 0 字节,可以被 strlen() 等 C 函数正确处理。

编码:将一个Unicode字符串转换为一个字节序列(a sequence of bytes,a string of bytes)。码位 <128 时与 ASCII 编码相同,码位 <255 时与 Latin-1 …

Django admin 数据保存时自定义操作

使用Django框架中的admin可以非常方便地实现常用的管理功能,但有时在通过Admin添加数据时,希望在数据保存时进行一些额外的操作,这可以通过重写ModelAdmin的save_model实现。

from django.contrib import admin
class ArticleAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        # 自定义操作
        obj.save()

通过使用ModelAdmin中的其它方法,可以对admin的其它功能进行更多的控制。

Django文档:https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model

Python使用urllib与BeautifulSoup下载并解析HTML

导入相关模块

import urllib.request
from bs4 import BeautifulSoup
from bs4 import SoupStrainer

下载并读取HTML内容

response = urllib.request.urlopen('http://www.baidu.com')
html_doc = response.read()

创建BeautifulSoup部分解析过滤器

only_nv_id = SoupStrainer(id='nv')

解析并输出百度nv中的文本内容

print(BeautifulSoup(html_doc, "html.parser", parse_only=only_nv_id).get_text())
新 闻 网 页 贴 吧 知 道 音 乐 图 片 视 频 

Python遍历清理VC项目中的Debug Release ipch 及 sdf

VC编译后生成的Debug、Release、ipch目录及sdf文件占用大量空间,不方便代码保存,写了个Python程序自动遍历清理。

import os
import shutil
  
def remove_vc_extra(root_dir):
    list_dirs = os.walk(root_dir, topdown=False)
    for dirpath, dirnames, filenames in list_dirs:
        for dirname in dirnames:
            if dirname == 'Debug' or dirname == 'Release' or dirname == 'ipch':
                shutil.rmtree(os.path.join(dirpath, dirname), ignore_errors=True)
        for filename in filenames: