Python

There are 12 entries for the tag Python

Python重新安装所有模块

MitchellChu 2017-03-10 其他技术

系统重装后,Python2.7也重装了,重装的时候,Python选的路径还是原来的,直接覆盖,因为很多packages,舍不得!但在使用命令行工具的时候,却报错: Fatal error in launcher: Unable to create process using '"' 处理的方法是将所有的python2.7下可以用命令行直接调用的包重新安装。也即Scripts文件夹下的exe对应的包重装,方法如下: @echo OFF REM 指定Scripts所在路径 set ScriptsHome=D:\Program Files\Python\2.7\Scripts REM 遍历文件,并获取文件名 for /F "delims=\" %%a in ('dir /b /a-d /o-d "%ScriptsHome%\*.exe"') do ( REM 调用pip install来重新安装, REM 注意::这里使用--force-reinstall参数 pip install %%~na --upgrade --force-reinstall ) 在重新安装的过程中,会有很多package提示没有(因为那时真的没有,有些包提供了几个命令行工具而已!=.=!!!),忽略即可,实在不放心,你可以尝试两遍上面的代码来重装,当所有的packages重新安装后,直接使用时将不会出现上面的错误。   TIPS:在安装的时候 ,如果有的包依赖了lxml的话,将会出现报错: Cannot open include file: 'libxml/xpath.h': No such file or directory ********************************************************************************* Could not find function xmlCheckVersion in library libxml2. Is libxml2 installed? ********************************************************************************* 这个报错是因为lxml在编译安装(需要VC++的编译环境,没有的话,请先安装VCForPython27,微软官网下载)的时候需要libxml2的支持,然而,似乎没有简单的方法可以直接处理,因此,直接到这里1下载对应的whl文件来进行安装更合适。 pip install path\to\lxml.whl   当然,如果你pip都报错的话,自然需要先安装好pip这个命令在来操作上面这些了。   参考: 1. http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml

使用Scrapy构建自己的定制网络爬虫

MitchellChu 2016-03-12 其他技术 编程语言

爬虫(Web Spider or Web Crawler),顾名思义:一个在网站之间互相游走的虫子,专好觅食各类页面数据。随着Spider技术门槛降低,爬虫也开始泛滥起来,很多时候爬虫变成了扒虫。然,技术本无善恶,全在用者之念。此处不做过多计较,我们当下要讨论也仅仅是定制一款自己的网络爬虫,仅此。
爬虫就Mitchell个人经验来说分为两大类:
•通用型网络爬虫:该类爬虫并无明确采集目标,每个能够爬及的页面都是其采集对象,除非满足系统指定条件,否则此类爬虫基本全年无休的辛勤劳作。最常见的就是搜索引擎的爬虫,如:Google,Baidu,Yahoo,Bing等;
•专用型网络爬虫:这种爬虫仅针对自身偏好的网站或者主题作为采集目标,采集到的内容或涉及到的URL为此爬虫不感兴趣的,将被爬虫直接忽略,此类爬虫根据需要采集的目标多寡采集时间有所不同。如:各类垂直搜索站,金融爬虫,站点采集等;

用时间换空间的缓存算法

MitchellChu 2016-02-18 其他技术 编程语言

在使用Scrapy爬网站的时候,产生出来的附加产物,因为在Scrapy爬取的时候,CPU的运行时间紧迫度不高(访问频次太高容易被封禁),借此机会难得来上一下,让自己的内存解放一下。 算法原理: 通过将要缓存的数据用二进制展开,得到的二进制数据映射到缓存字段上,要检验是否已经缓存过,仅需要去查找对应的映射位置即可,如果全部匹配上,则已经缓存。 # 二进制就是个二叉树 # 如下面可以表示出来的数据有0, 1, 2, 3四个(两个树独立) 0 1 / \ / \ 0 1 0 1 因此对缓存的操作就转化为对二叉树的操作,添加和查找只要在二叉树上找到对应路径的node即可。   算法关键代码: def _read_bit(self, data, position): return (data >> position) & 0x1 def _write_bit(self, data, position, value): return data | value << position   实际使用效果如何呢? 在和Python默认的set相比较,得出测试结果如下(存取整型,不定长字符串,定长字符串): Please select test mode:4 Please enter test times:1000 ==================================================================================================== TEST RESULT:: ==================================================================================================== set() ...

Python在Console下显示文本进度条的方法

MitchellChu 2016-02-13 其他技术

在用Python处理耗时的任务时,往往希望能够了解到任务当前的处理进度,这个时候需要在任务中不断打印出任务的进度信息。一般我们是这样的: def process_mission(): """ 任务处理方法 """ # 这里是任务处理过程 print('当前处理到第[%d]项' % count) # 这里是任务处理过程  这种方式会在窗口输出一堆类似下面这样的信息: 当前处理到第1项 当前处理到第2项 当前处理到第3项 当前处理到第4项 当前处理到第5项 .... 这种信息有可能非常非常的长,也有可能输出的时候非常非常的快,以至于根本就无法看清楚(输出非常快的时候)。 这时候,我们期待这样的功能: [================== ] 25.60% 但如果纯粹的使用print是无法达到效果的,会变成和前面一样,满屏都是这种杠杠。 如何正确显示进度条呢? Python提供了一个模块,叫:progressbar,当使用这个模块之后,你要显示进度的仅需如下: import progressbar # 先定义一个进度条 # http://blog.useasp.net/ pbar = progressbar.ProgressBar(maxval=100, \ widgets=[progressbar.Bar('=', '[', ']'), ' ', \ progressbar.Percentage()]) for i in xrange(100): # 更新进度条 pbar.update(i+1) pbar.finish() # Ok,到此完结。  是不是很容易就完成进度条的显示?不过遗憾的是,这个python模块并不是默认的,而是需要安装: pip install progressbar 如果没有安装pip可以参考这里 。 对于只要一个简单进度条的人来说,安装个python包似乎有点动静太大,那么,自己动手写一个便是了。 下面是Mitchell自己写的一个类似的进度条,不用安装包,简单易用。 # 在使用本方法之前,请先做如下import # from __future__ import division # import math # import sys # ##blog.useasp.net## def progressbar(cur, total): percent = '{:.2%}'.format(cur / total) sys.stdout.write('\r') ...

Python产生token唯一值的算法性能比较

MitchellChu 2015-11-08 其他技术

在很多场合的时候,我们都需要产生不重复的字符串来标志操作的唯一性,比如:HTTP请求中,我们需要产生SessionID,在数据存储的时候,我们也可能需要生成唯一的字符串来作为数据的ID以便我们进行索引。本文的由来是在使用tornado的时候,需要使用Session,Session需要有唯一的ID值。为了尽可能快速的生成安全可用的Session ID,而对Python当前的一些比较通用的生成方法进行了比较。为了方便说明,后继的所有说法均以token作为SessionID, 唯一字串等的统一表述。 在网络中比较流行的是使用uuid4().hex的方式来生成token,但另外一种声音是,uuid4().hex的安全性不高,需要使用安全性更高的算法来代替,后继出现了使用os.urandom(24),或者自行随机生成字符串的形式(uuid4使用的是os.urandom(16)),再到后来,使用OpenSSL和M2Crypto的方式来生成随机数。OpenSSL和M2Crypto需要Python安装pyOpenSSL和M2Crypto。M2Crypto由于接触少,因此没有对M2Crypto进行测试。   测试环境: CPU: Intel Xeon E3 3.30Hz 3.70Hz Memory: 16GB System: Windows 7 64-bits # times:测试次数 # func: 要测试的函数名称 # 此方法是入口方法 # 各个算法以函数的形式定义,接受times参数即可——By MitchellChu def crash_testx(times, func): import time print('\r\n--------------------------------------------') print("test function: %s" % func.func_name) print("begin time: %s" % time.strftime('%Y%m%d %X')) begin_time = time.time() (crashed_times, hash_data_len) = func(times) print("end time: %s" % time.strftime('%Y%m%d %X')) print("take time:%s" % (time.time() - begin_time)) print("test times: %d, crashed times:%d, hash data length:%d" % (times, crashed_times, hash_data_len)) print('--------------------------------------------\r\n')   产生方式(generate method) ...

将自己写的Python代码打包放到PyPI上

MitchellChu 2014-09-09 其他技术

如果是开源的Python代码,为了能够让大家更方便的使用,放到PyPI上也许是个非常不错的主意(PyPI:Python Package Index)。刚开始我以为要将代码打包放到PyPI上是一件非常复杂繁琐的事情,不过看过《Dive Into Python 3》的PACKAGING PYTHON LIBRARIES介绍(CHAPTER 16),并自己动手操作了一下,发现打包发布这个事情并没有想象中的那么有难度。为了方便其他朋友阅读的方便,就尝试写了这个博文,来记录下如何将自己写的Python代码打包上传到PyPI上。 在Python的世界里,有个叫Distutils的工具模块可以帮我们轻松的解决这个问题,既然这样,让我们开始打包之旅吧。 要打包代码,首先你的确保你的代码得是个包。比如,你写了一些功能的代码块,为了方便引用,你就需要将代码变成一个包,下次需要使用的时候,直接引用这个包里面的某个具体功能就好了。在Python中,要将这些代码变成包非常容易,你的这些功能的合集,可以用一个你觉得合适的名称来命名,创建这个命名的文件夹,并在文件夹下创建一个__init__.py文件,剩余的就是将你这些代码放入到这个文件夹下面即可。整理成包的文件结构大概像下面这样: somefunctions/ | +-- __init__.py | +-- myscripts1.py | +-- mysscripts2.py | +-- mymorescripts.py | somefunctions就是你包的名称,下面my***.py的各种文件就是你原有的各种代码模块。是不是很简单就将自己的代码变成了包?确实很简单,你这步就是新建一个文件夹,把文件全放进去而已——哦,还有添加个__init__.py文件(文件内容可以为空). 到这里,我们已经有Python包了,如果不传到PyPI上的话,你都可以直接用了,最直接的方法是将这个文件夹拷到你的项目目录下,然后在项目代码里,你大概就能引用它了: import somefunctions module = somefunctions.myscripts1 ### 这里你就可以调用myscripts1里面的功能了. 当然,我们的目标是打包到PyPI上,而不是将这个包拷来拷去的,后面安装一下,引用起来将更加的方便。 好了,既然要放到PyPI上,那么我们就需要在上面的基础上,在加点料。首先,我们需要调整下文件的目录结构,把上面的改成下面这个样子: somefunctions/ | +-- somefunctions/ . | . +-- __init__.py . | ....

reStructuredText(.rst)语法规则快速入门

MitchellChu 2014-09-05 其他技术

这几天写了个Python的模块,用Markdown写个个README,传到GitHub,感觉效果还不错,就难抑冲动,打了个包,也想放到PyPI上,结果放上去,发现README变成了源代码。一查,才发现PyPI竟然不支持Markdown格式的README文件,好像支持的README要reStructuredText格式的,对菜鸟的我来说这是个坑啊,好不容易在Emacs下用Markdown用的有点熟路了,结果发现却不被支持。只好重新看看reStructuredText的语法了,因此,也就有了此篇reStructuredText语法快速入门。 先文绉绉的来一段reStructuredText的介绍吧: reStructuredText是一种轻量级的文本标记语言,直译为:重构建的文本,为Python中Docutils项目的一部分。其一般保存的文件以.rst为后缀。在必要的时候,.rst文件可以被转化成PDF或者HTML格式,也可以有Sphinx转化为LaTex,man等格式,现在被广泛的用于程序的文档撰写。  好了,时间无多,直接正题: reStructuredText大致分章节,段落,块和列表这几种内容。而在这其中reStructuredText最主要用得到的标记也就是: 标题 段落 列表 表格 块(如:代码块) 样式 下面一一介绍:     标题(Title) 来看看标题的实例: =================== 这就是一个标题 =================== ---------------- 这也是一个章节标题 ---------------- 怎么样,看起来不难吧,你只要按这个写法,就能被reStructuredText认识,并被解释为章节标题。reStructuredText可用于作为标题修饰的字符有很多很多: ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ 只要你想,上面的任意一个都可以用来作为标题的修饰符,当然,reStructuredText也是有推荐的,它推荐下面这些字符: = - ` : . ' " ~ ^ _ * + # 这些字符是上面一堆字符中稍微看起来不会那么奇怪的一部分,当然,个人建议不要那么花哨,尽量用这两个中的一个: = - 上面实例的写法也许有点复杂,.rst文件中,你还可以只给出下半部分的字符即可: 这个标题和上面的一样 =================== TIPS:作为修饰的字符长度要大于等于文字长度。另外,标题是能够嵌套的。   段落(Paragraphs) 段落一般隶属于某个章节中,是一块左对齐并且没有其他元素体标记的块。在.rst文件中,段落和其他内容的分割是靠空行来完成,如果段落相较于其他的段落有缩进,reStructuredText会解析为引用段落,样式上有些不同。 这里是一段reStructuredText的内容,它可以很长很长。。。。最后,末尾留出空行表示是本段落的结束即可。 这里是另外一段reStructuredText的内容,这段内容和上一段之间,乃至后面的其他内容之间都要留出空行进行分割。 这个也是段落,当时由于缩进了,会变成引用段落。显示和直接的段落有点不同   列表(List) 列表在HTML中被分为两种,一个是有序列表(Enumerated Lists),一种是无序列表(Bullet Lists),在reStructuredText中,我们也能找到这两种列表,还有一种称为定义列表(Definition Lists),这和HTML中的DL一样,在.rst文件中可以支持嵌套列表。 无序列表要求文本块是以下面这些字符开始,并且后面紧跟空格,而后跟列表项的内容,其中列表项比趋势左对齐并且有与列表对应的缩进。 * + - • ‣ ⁃ 还是那句话,用最常用的几个字符就好,不用那么花哨。下面是示例: - 这里是列表的第一个列表项 - 这是第二个列表项 - 这是第三个列表项 - 这是缩进的第一个列表项 注意,这里的缩进要和当前列表项的缩进同步。 - 第一级的第四个列表项 - 列表项之间要用个空格来分割。 有序列表在格式上和无序列表差不多,但是在使用的前缀修饰符上,使用的不是无序列表那种字符,而是可排序的字符,可以识别的有下面这些: arabic numerals: 1, 2, 3, ... (no...

Tornado中的secure cookie

MitchellChu 2014-08-13 其他技术 编程语言

在开始用Python的web框架Tornado的时候,以为Tornado中的get_secure_cookie和set_secure_cookie是用来设置加密后的Cookie信息的,但今天看了源代码之后,发现情况并非如想象的那样,secure_cookie在Tornado中的作用是对Cookie值进行签名而已。新版本(v4.0)和老版本(1.0)相较而言,虽然增加了第二个版本的secure_cookie,但功能仍然是一样。 在Tornado 1.0中,使用的是SHA1进行签名,而在Tornado 4.0中的新版本中使用的是SHA256进行签名,同时输出的Cookie格式有差异——开始第一个数字是版本号(secure cookie使用的version,而非Tornado的版本)。 新版本的set_secure_cookie设置Cookie的相关源码如下: ## Tornado 4.0中web.py的部分源码 ## set_secure_cookie相关的源码 MIN_SUPPORTED_SIGNED_VALUE_VERSION = 1 MAX_SUPPORTED_SIGNED_VALUE_VERSION = 2 DEFAULT_SIGNED_VALUE_VERSION = 2 DEFAULT_SIGNED_VALUE_MIN_VERSION = 1 class RequestHandler(object): def set_cookie(self, name, value, domain=None, expires=None, path="/", expires_days=None, **kwargs): name = escape.native_str(name) value = escape.native_str(value) if re.search(r"[\x00-\x20]", name + value): raise ValueError("Invalid cookie %r: %r" % (name, value)) ...

Python用fork来创建子进程

MitchellChu 2014-07-02 其他技术 编程语言

今天看到别人的源代码中有fork子进程来操作数据。但是由于fork之后,没有及时的退出,导致系统中的Python进程越来越多,子进程越来越多了。自己随手写了Python下fork进程的测试代码(来说明这个问题不一定完全合适): def fork(a): def now(): import datetime return datetime.datetime.now().strftime("%S.%f") import os import time print now(), a if os.fork() == 0: print '子进程[%s]:%s' % (now(), os.getpid()) while 1: a-=10 print '子进程的a值[%s]:%s' % (now(), a) ...

Python函数的各种参数(含星号参数)

MitchellChu 2014-06-23 编程语言

Python中函数的参数有4种形式,分别是: 位置或关键字参数(Positional-or-keyword parameter) 仅位置的参数(Positional-only parameter) 任意数量的位置参数(var-positional parameter) 任意数量的关键字参数(var-keyword parameter) 第一种:位置或关键字参数 这种参数是Python中默认的参数类型,定义这种参数后,可以通过位置参数,或者关键字参数的形式传递参数: ## 位置或者关键字参数 ## 这个是Python的默认参数类型 ## 示例:arg2提供了默认value def func(arg1, arg2="World!"): print arg1, arg2 ## func可以通过位置参数形式调用 func("Hello", "MitchellChu") ## 也可以通过关键字参数的形式来调用func func(arg1="Hello", arg2="World!") ## 当然,混合的方式也是完全没有问题的 func("Hello", arg2="World!") ## 不过如果你不能将关键字参数优先于位置参数传递给函数(方法) ## 这个调用方法是不能接受的,因为优先级不一样.后面会说 func(arg1="Hello", "World!") ## ERROR  第二种方式:仅适用位置参数的形式 这种形式在需要将参数传递给函数(方法)时,仅能通过位置参数的传递方式。这种形式对于Python的开发者来说,暂时并没有办法使用。这种形式现在仅存在Python的很多内建的函数上: ## Positional-only parameter has no syntax to define ## 虽然无定义方法,但内建的很多函数都是仅接受位置参数的 abs(-3) ## correct abs(a=3) ## wrong ## Traceback (most recent call last): ## File "<stdin>", line 1, in <module> ## TypeError: abs() takes no keyword arguments pow(x=2,y=3) ## Traceback (most recent call last): ## File "<stdin>", line 1, in <module> ## TypeError: pow() takes no keyword arguments pow(2,3) ## 8  第三种:任意数量的位置参数(带单个星号参数) 任意数量的位置参数在定义的时候是需要一个星号前缀来表示,在传递参数的时候,可以在原有参数的后面添加任意多个参数,这些参数将会被放在元组内提供给函数(方法): ## var-positional parameter ## 定义的时候,我们需要添加单个星号作为前缀 def func(arg1, arg2, *args): ...

CentOS下编译安装Python2.7.6

MitchellChu 2014-05-07 Unix & Linux

CentOS下面Python在升级到2.7.6的时候,没有找到安装包直接安装,只能通过源代码编译的方式来安装Python 2.7.6版本。这篇是编译和安装Python2.7.6的过程记录。 CentOS系统中安装了development tools。要编译安装Python,执行下面代码: $ pushd /usr/local/src $ sudo mkdir python $ sudo chown $USER python $ cd python $ wget https://www.python.org/ftp/python/2.7.6/Python-2.7.6.tgz $ tar zxvf Python-2.7.6.tgz $ cd Python-2.7.6 $ ./configure --prefix=/usr/local/python-2.7.6 && make $ sudo make install 代码过程: 1. 在/usr/local/src创建python文件夹,并将Python文件夹所有者设置为当前用户(非root) 2. 进入创建的python目录下,从官方网站上下载python2.7.6源代码包。 3. (非必须)如果要校验包的一致性,可以在官方网站上下载sig文件,并通过PGP校验文件,也可以通过官网提供的MD5校验下载的压缩包。更多关于校验的信息请参考Linux下校验文件的完整性(MD5,SHA1,PGP)。本代码忽略了此过程。 4. 解压压缩包到当前目录,并进入Python-2.7.6目录 5. 配置python并编译。这步只是用了--prefix参数指示安装路径。 6. 安装Python [也可使用altinstall的安装方式,这样文件末尾会带上版本号。updated: 2015-07-13] 上面是在Python编译安装顺利的情况下的大体流程,但是我在编译的时候,Python出现了下面的提示信息: Python build finished, but the necessary bits to build these modules were not found: _bsddb _sqlite3 _ssl _tkinter bsddb185 bz2 ...

Windows下Python,setuptools,pip,virtualenv的安装

MitchellChu 2014-01-16 其他技术 编程语言

Windows 2003平台,安装Python2.7.4,Python3.3,setuptools,pip,virtualenv。 安装Python2.7.4(当前版本是2.7.6),安装路径:C:\Python27 安装Python3.3.2,安装路径:C:\Python33 安装完毕之后,请勿将python的目录添加到系统的环境变量中。 优先安装setuptools后面的pip和virtualenv可以通过easy_install来安装。 setuptools可以在 http://pypi.python.org/pypi/setuptools 找到Windows的安装方式,现在官网建议使用的是下载ez_setup.py来安装。 下载完ez_setup.py,CMD下路由到下载目录,使用: C:\Python27\Scripts\python.exe ez_setup.py 下载完毕最新版本之后,系统会自动安装setuptools,安装完毕之后,会在scripts下会有一个easy_install.exe可执行文件。 当安装完毕setuptools之后,剩下的就比较简单了。 # 安装pip >C:\Python27\Scripts\easy_install.exe pip #安装完成pip之后,接着安装virtualenv >C:\Python27\Scripts\easy_install.exe virtualenv==1.10.1 安装完毕之后,同样在Scripts下面可以看到pip.exe和virtualenv.exe文件。需要注意,当前irtualenv的版本是1.11,安装的时候如果不设定==1.10.1,默认会安装最新版本,而1.11版本的virtualenv是有问题的,安装1.11后,在创建环境的时候会失败,报错: setuptools pip failed with error code 1.这个问题是1.11的本身的问题,用1.10.1版本,没有这个问题,所以我们安装的时候需要明确版本1.10.1。 安装完毕virtualenv之后,就可以创建虚拟环境了: #创建虚拟环境:先在cmd中路由到需要创建虚拟环境的目录下,创建的虚拟环境是在该目录下的一个文件夹 >c:\python27\Scripts\virtualenv.exe vProject 创建之后,我们可以检查下vProject下是否有文件,同时确认下vProject\Scripts\下是否有activate.bat和deactivate.bat两个文件。至此,虚拟环境就创建好了。运行虚拟环境只需要在CMD下运行activate.bat,并在当前窗口中进行操作——所有的操作此时都已经在虚拟环境中进行的。

关于博主

  一枚成分复杂的网络IT分子,属于互联网行业分类中的杂牌军。