存档

文章标签 ‘python’

非常简单的PYTHON HTTP服务

2017年8月9日 评论已被关闭

非常简单的PYTHON HTTP服务

如果你急需一个简单的Web Server,但你又不想去下载并安装那些复杂的HTTP服务程序,比如:Apache,ISS等。那么, Python 可能帮助你。使用Python可以完成一个简单的内建 HTTP 服务器。于是,你可以把你的目录和文件都以HTTP的方式展示出来。佻只需要干一件事情,那就是安装一个Python。

实际上来说,这是一个可以用来共享文件的非常有用的方式。实现一个微型的HTTP服务程序来说是很简单的事情,在Python下,只需要一个命令行。下面是这个命令行:(假设我们需要共享我们的目录 /home/haoel 而IP地址是192.168.1.1)
$ cd /home/haoel
$ python -m SimpleHTTPServer

这就行了,而我们的HTTP服务在8000号端口上侦听。你会得到下面的信息:

Serving HTTP on 0.0.0.0 port 8000 …
你可以打开你的浏览器(IE或Firefox),然后输入下面的URL:

http://192.168.1.1:8000
如果你的目录下有一个叫 index.html 的文件名的文件,那么这个文件就会成为一个默认页,如果没有这个文件,那么,目录列表就会显示出来。

如果你想改变端口号,你可以使用如下的命令:
$ python -m SimpleHTTPServer 8080
如果你只想让这个HTTP服务器服务于本地环境,那么,你需要定制一下你的Python的程序,下面是一个示例:
import sys
import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
HandlerClass = SimpleHTTPRequestHandler
ServerClass = BaseHTTPServer.HTTPServer
Protocol = “HTTP/1.0”

if sys.argv[1:]:
port = int(sys.argv[1])
else:
port = 8000
server_address = (‘127.0.0.1’, port)

HandlerClass.protocol_version = Protocol
httpd = ServerClass(server_address, HandlerClass)

sa = httpd.socket.getsockname()
print “Serving HTTP on”, sa[0], “port”, sa[1], “…”
httpd.serve_forever()
注意:所有的这些东西都可以在 Windows 或 Cygwin 下工作。

分类: Python编程 标签:

使用国内镜像源来加速python pypi包的安装

2016年10月24日 评论已被关闭

使用国内镜像源来加速python pypi包的安装

http://topmanopensource.iteye.com/blog/2004853

pipy国内镜像目前有:

 

http://pypi.douban.com/  豆瓣

http://pypi.hustunique.com/  华中理工大学

http://pypi.sdutlinux.org/  山东理工大学

http://pypi.mirrors.ustc.edu.cn/  中国科学技术大学

 

对于pip这种在线安装的方式来说,很方便,但网络不稳定的话很要命。使用国内镜像相对好一些,

 

如果想手动指定源,可以在pip后面跟-i 来指定源,比如用豆瓣的源来安装web.py框架:

pip install web.py -i http://pypi.douban.com/simple

 

注意后面要有/simple目录!!!

 

要配制成默认的话,需要创建或修改配置文件(linux的文件在~/.pip/pip.conf,windows在%HOMEPATH%\pip\pip.ini),修改内容为:

code:

[global]

index-url = http://pypi.douban.com/simple

 

这样在使用pip来安装时,会默认调用该镜像。

更多配置参数见:http://www.pip-installer.org/en/latest/configuration.html

 

 

 

Configuration

Config file

pip allows you to set all command line option defaults in a standard ini style config file.

The names and locations of the configuration files vary slightly across platforms.

  • On Unix and Mac OS X the configuration file is: $HOME/.pip/pip.conf
  • On Windows, the configuration file is: %HOME%\pip\pip.ini

You can set a custom path location for the config file using the environment variable PIP_CONFIG_FILE.

The names of the settings are derived from the long command line option, e.g. if you want to use a different package index (--index-url) and set the HTTP timeout (--default-timeout) to 60 seconds your config file would look like this:

[global]
timeout = 60
index-url = http://download.zope.org/ppix

Each subcommand can be configured optionally in its own section so that every global setting with the same name will be overridden; e.g. decreasing the timeout to 10 seconds when running the freeze(Freezing Requirements) command and using 60 seconds for all other commands is possible with:

[global]
timeout = 60

[freeze]
timeout = 10

Boolean options like --ignore-installed or --no-dependencies can be set like this:

[install]
ignore-installed = true
no-dependencies = yes

Appending options like --find-links can be written on multiple lines:

[global]
find-links =
    http://download.example.com

[install]
find-links =
    http://mirror1.example.com
    http://mirror2.example.com

Environment Variables

pip’s command line options can be set with environment variables using the formatPIP_<UPPER_LONG_NAME> . Dashes (-) have to replaced with underscores (_).

For example, to set the default timeout:

export PIP_DEFAULT_TIMEOUT=60

This is the same as passing the option to pip directly:

pip --default-timeout=60 [...]

To set options that can be set multiple times on the command line, just add spaces in between values. For example:

export PIP_FIND_LINKS="http://mirror1.example.com http://mirror2.example.com"

is the same as calling:

pip install --find-links=http://mirror1.example.com --find-links=http://mirror2.example.com

Config Precedence

Command line options have precedence over environment variables, which have precedence over the config file.

Within the config file, command specific sections have precedence over the global section.

Examples:

  • --host=foo overrides PIP_HOST=foo
  • PIP_HOST=foo overrides a config file with [global] host = foo
  • A command specific section in the config file [<command>] host = bar overrides the option with same name in the [global] config file section

Command Completion

pip comes with support for command line completion in bash and zsh.

To setup for bash:

$ pip completion --bash >> ~/.profile

To setup for zsh:

$ pip completion --zsh >> ~/.zprofile

Alternatively, you can use the result of the completion command directly with the eval function of you shell, e.g. by adding the following to your startup file:

eval "`pip completion --bash`"

Window 需要修改:

%PYTHON_HOME%\Lib\site-packages\pip\cmdoptions.py

Java代码  收藏代码
  1. index_url = OptionMaker(
  2.     ‘-i’‘–index-url’‘–pypi-url’,
  3.     dest=‘index_url’,
  4.     metavar=‘URL’,
  5.     #default=‘https://pypi.python.org/simple/’,
  6.      default=‘http://mirrors.bistu.edu.cn/pypi/’,
  7.     help=‘Base URL of Python Package Index (default %default).’)

 

%PYTHON_HOME%\Lib\site-packages\pip\commands\search.py

 

Java代码  收藏代码
  1. class SearchCommand(Command):
  2.     “”“Search for PyPI packages whose name or summary contains <query>.”“”
  3.     name = ‘search’
  4.     usage = “”
  5.       %prog [options] <query>“”
  6.     summary = ‘Search PyPI for packages.’
  7.     def __init__(self, *args, **kw):
  8.         super(SearchCommand, self).__init__(*args, **kw)
  9.         self.cmd_opts.add_option(
  10.             ‘–index’,
  11.             dest=‘index’,
  12.             metavar=‘URL’,
  13.             #default=‘https://pypi.python.org/pypi’,
  14.             default=‘http://mirrors.bistu.edu.cn/pypi/’,
  15.             help=‘Base URL of Python Package Index (default %default)’)
  16.         self.parser.insert_option_group(0, self.cmd_opts)

 

[Linux]修改easy_install和pip的镜像地址

使用easy_install和pip会让Pyhthon的模块安装和管理变得非常简单,但是,如果你身在国内的话,从官方的镜像下载的速度是很令人抓狂的事情,如同修改apt-get或yum的镜像地址一样,easy_install和pip也需要修改镜像地址。修改easy_install和pip的镜像地址通常可以有以下两种方法,可以分别使用命令和配置方式实现。

方法1:命令方式临时修改
easy_install:

1
easy_install -i http://e.pypi.python.org/simple fabric

pip:

1
pip -i http://e.pypi.python.org/simple install fabric

 

方法2:配置方式修改
easy_install:
1.打开pydistutils.cfg

1
vi ~/.pydistutils.cfg

2.写入以下内容

1
2
[easy_install]
index_url = http://e.pypi.python.org/simple

pip:
1.打开pip.conf

1
vi ~/.pip/pip.conf

2.写入以下内容

1
2
[global]
index-url = http://e.pypi.python.org/simple

速度比较快的国内镜像,都来自清华大学,服务器在北京。公网的服务器为官方镜像
公网:http://e.pypi.python.org/simple
教育网:http://pypi.tuna.tsinghua.edu.cn/simple

分类: Python编程 标签:

python 的日志logging模块学习

2016年5月18日 评论已被关闭

python 的日志logging模块学习

http://www.cnblogs.com/dkblog/archive/2011/08/26/2155018.html

1.简单的将日志打印到屏幕

 
import logging

logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

屏幕上打印:
WARNING:root:This is warning message

默认情况下,logging将日志打印到屏幕,日志级别为WARNING;
日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,当然也可以自己定义日志级别。

2.通过logging.basicConfig函数对日志的输出格式及方式做相关配置

import logging

logging.basicConfig(level=logging.DEBUG,
               format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
               datefmt='%a, %d %b %Y %H:%M:%S',
               filename='myapp.log',
               filemode='w')
   
logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

./myapp.log文件中内容为:
Sun, 24 May 2009 21:48:54 demo2.py[line:11] DEBUG This is debug message
Sun, 24 May 2009 21:48:54 demo2.py[line:12] INFO This is info message
Sun, 24 May 2009 21:48:54 demo2.py[line:13] WARNING This is warning message

logging.basicConfig函数各参数:
filename: 指定日志文件名
filemode: 和file函数意义相同,指定日志文件的打开模式,’w’或’a’
format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所示:
%(levelno)s: 打印日志级别的数值
%(levelname)s: 打印日志级别名称
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s: 打印当前执行程序名
%(funcName)s: 打印日志的当前函数
%(lineno)d: 打印日志的当前行号
%(asctime)s: 打印日志的时间
%(thread)d: 打印线程ID
%(threadName)s: 打印线程名称
%(process)d: 打印进程ID
%(message)s: 打印日志信息
datefmt: 指定时间格式,同time.strftime()
level: 设置日志级别,默认为logging.WARNING
stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略

3.将日志同时输出到文件和屏幕

import logging

logging.basicConfig(level=logging.DEBUG,
               format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
               datefmt='%a, %d %b %Y %H:%M:%S',
               filename='myapp.log',
               filemode='w')

#################################################################################################
#定义一个StreamHandler,将INFO级别或更高的日志信息打印到标准错误,并将其添加到当前的日志处理对象#
console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)
#################################################################################################

logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

屏幕上打印:
root        : INFO     This is info message
root        : WARNING  This is warning message

./myapp.log文件中内容为:
Sun, 24 May 2009 21:48:54 demo2.py[line:11] DEBUG This is debug message
Sun, 24 May 2009 21:48:54 demo2.py[line:12] INFO This is info message
Sun, 24 May 2009 21:48:54 demo2.py[line:13] WARNING This is warning message

4.logging之日志回滚

import logging
from logging.handlers import RotatingFileHandler

#################################################################################################
#定义一个RotatingFileHandler,最多备份5个日志文件,每个日志文件最大10M
Rthandler = RotatingFileHandler('myapp.log', maxBytes=10*1024*1024,backupCount=5)
Rthandler.setLevel(logging.INFO)
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
Rthandler.setFormatter(formatter)
logging.getLogger('').addHandler(Rthandler)
################################################################################################

从上例和本例可以看出,logging有一个日志处理的主对象,其它处理方式都是通过addHandler添加进去的。
logging的几种handle方式如下:

logging.StreamHandler: 日志输出到流,可以是sys.stderr、sys.stdout或者文件
logging.FileHandler: 日志输出到文件

日志回滚方式,实际使用时用RotatingFileHandler和TimedRotatingFileHandler
logging.handlers.BaseRotatingHandler
logging.handlers.RotatingFileHandler
logging.handlers.TimedRotatingFileHandler

logging.handlers.SocketHandler: 远程输出日志到TCP/IP sockets
logging.handlers.DatagramHandler:  远程输出日志到UDP sockets
logging.handlers.SMTPHandler:  远程输出日志到邮件地址
logging.handlers.SysLogHandler: 日志输出到syslog
logging.handlers.NTEventLogHandler: 远程输出日志到Windows NT/2000/XP的事件日志
logging.handlers.MemoryHandler: 日志输出到内存中的制定buffer
logging.handlers.HTTPHandler: 通过”GET”或”POST”远程输出到HTTP服务器

由于StreamHandler和FileHandler是常用的日志处理方式,所以直接包含在logging模块中,而其他方式则包含在logging.handlers模块中,
上述其它处理方式的使用请参见python2.5手册!

5.通过logging.config模块配置日志

#logger.conf

###############################################

[loggers]
keys=root,example01,example02

[logger_root]
level=DEBUG
handlers=hand01,hand02

[logger_example01]
handlers=hand01,hand02
qualname=example01
propagate=0

[logger_example02]
handlers=hand01,hand03
qualname=example02
propagate=0

###############################################

[handlers]
keys=hand01,hand02,hand03

[handler_hand01]
class=StreamHandler
level=INFO
formatter=form02
args=(sys.stderr,)

[handler_hand02]
class=FileHandler
level=DEBUG
formatter=form01
args=('myapp.log', 'a')

[handler_hand03]
class=handlers.RotatingFileHandler
level=INFO
formatter=form02
args=('myapp.log', 'a', 10*1024*1024, 5)

###############################################

[formatters]
keys=form01,form02

[formatter_form01]
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
datefmt=%a, %d %b %Y %H:%M:%S

[formatter_form02]
format=%(name)-12s: %(levelname)-8s %(message)s
datefmt=

上例3:

import logging
import logging.config

logging.config.fileConfig("logger.conf")
logger = logging.getLogger("example01")

logger.debug('This is debug message')
logger.info('This is info message')
logger.warning('This is warning message')

上例4:

import logging
import logging.config

logging.config.fileConfig("logger.conf")
logger = logging.getLogger("example02")

logger.debug('This is debug message')
logger.info('This is info message')
logger.warning('This is warning message')

6.logging是线程安全的

from:http://blog.csdn.net/yatere/article/details/6655445

分类: Python编程 标签:

Python.h: No such file or directory解决

2016年5月15日 评论已被关闭
分类: Python编程 标签:

CentOS下编译安装python包管理安装工具pip教程

2015年9月9日 评论已被关闭

CentOS下编译安装python包管理安装工具pip教程

http://www.ailab.cn/article/2015082233598.html
之前有的朋友问我,CentOS版本怎么安装python的pip,我之前给出的Ubuntu下apt-get的方法

ubuntu 需要先安装下pip吧,

复制代码

代码如下:

apt-get install python-pip

安装requests,

复制代码

代码如下:

pip install requests

但是有的朋友由于是centos的,直接 yum install pip或者 yum install python-pip都是不行的。

其实不能yum那就直接下载编译安装呗。。。

CentOS 6.4安装pip,CentOS安装python包管理安装工具pip的方法如下:

截至包子写本文的时候,pip最新为 1.5.5

复制代码

代码如下:

wget –no-check-certificate https://github.com/pypa/pip/archive/1.5.5.tar.gz

注意:wget获取https的时候要加上:–no-check-certificate

复制代码

代码如下:

tar zvxf 1.5.5.tar.gz#解压文件

cd pip-1.5.5/

python setup.py install

OK,这样就安装好pip了,

下面来安装 requests吧。

复制代码

代码如下:

pip install requests

分类: Python编程 标签: ,

CentOS下编译安装python包管理安装工具pip教程

2015年9月9日 评论已被关闭

CentOS下编译安装python包管理安装工具pip教程
http://www.th7.cn/system/lin/201502/84053.shtml
之前有的朋友问我,CentOS版本怎么安装python的pip,我之前给出的Ubuntu下apt-get的方法
ubuntu 需要先安装下pip吧,
apt-get install python-pip

安装requests,
pip install requests

但是有的朋友由于是centos的,直接 yum install pip 或者 yum install python-pip都是不行的。
其实不能yum那就直接下载编译安装呗。。。
CentOS 6.4安装pip,CentOS安装python包管理安装工具pip的方法如下:
截至包子写本文的时候,pip最新为 1.5.5
wget –no-check-certificate https://github.com/pypa/pip/archive/1.5.5.tar.gz

注意:wget获取https的时候要加上:–no-check-certificate
tar zvxf 1.5.5.tar.gz #解压文件
cd pip-1.5.5/
python setup.py install

OK,这样就安装好pip了,
下面来安装 requests吧。
pip install requests

分类: Python编程 标签: ,

Linux下python升级步骤

2015年9月8日 评论已被关闭

Linux下python升级步骤
http://www.cnblogs.com/lanxuezaipiao/archive/2012/10/21/2732864.html
首先下载源tar包

可利用linux自带下载工具wget下载,如下所示:

1
# wget http://www.python.org/ftp/python/3.3.0/Python-3.3.0.tgz
或自己去网上找,这里提供一个最新版的下载链接:http://xiazai.zol.com.cn/detail/33/320958.shtml

这里我用的是第二种方法,下载的是Python-3.1.2.tar.bz2版本,下载完成后到下载目录下,解压

1
bunzip2 Python-3.1.2.tar.bz2
2
tar -xvf Python-3.1.2.tar(若是第一种方法,则直接解压缩tar -xzvf Python-3.3.0.tgz)
进入解压缩后的文件夹

1
cd Python-3.1.2
在编译前先在/usr/local建一个文件夹python3(作为python的安装路径,以免覆盖老的版本)

1
mkdir /usr/local/python3
开始编译安装

1
./configure –prefix=/usr/local/python3
2
make
3
make install
此时没有覆盖老版本,再将原来/usr/bin/python链接改为别的名字

1
mv /usr/bin/python /usr/bin/python_old
再建立新版本python的链接

1
ln -s /usr/local/python3/bin/python3 /usr/bin/python
这个时候输入

1
python
就会显示出python的新版本信息

1
Python 3.1.2 (r312:79147, Oct 21 2012, 01:03:21))
2
[GCC 3.2.2 20030222 (Red Hat Linux 3.2.2-5)] on linux2
3
Type “help”, “copyright”, “credits” or “license” for more information.
4
>>>
PS:如果不建立新安装路径python3,而是直接默认安装,则安装后的新python应该会覆盖linux下自带的老版本,也有可能不覆盖,具体看安装过程了,这个大家可以自己试验下,当然如果还想保留原来的版本,那么这种方法最好不过了。

分类: Python编程 标签:

升级python到2.7

2015年9月8日 评论已被关闭

升级python到2.7
http://gavinshaw.blog.51cto.com/385947/610585/
眼看着python3 都出来了,vps上用的还是2.4的版本额,确实汗了一把。决定升级下python。
python2.7是2.X的最后一个版本,同时她也加入了一部分3.X的新特性。so 让我们升级吧!
查看系统当前python版本
2: [root@wangyuelou ~]# python
1:
3: Python 2.4.3 (#1, May 5 2011, 16:39:10)
4: [GCC 4.1.2 20080704 (Red Hat 4.1.2-50)] on linux2
5: Type “help”, “copyright”, “credits” or “license” for more information.
6: >;>>
7: [root@wangyuelou ~]#
下载新版本的python
1: [root@wangyuelou ~]# wget http://python.org/ftp/python/2.7.2/Python-2.7.2.tgz

解压缩 以及编译
1: [root@wangyuelou ~]# tar xvf Python-2.7.2.tar.bz2
2: [root@wangyuelou Python-2.7.2]# ./configure –prefix=/usr/local/python27
3: [root@wangyuelou Python-2.7.2]# make
4: [root@wangyuelou Python-2.7.2]# make install
5: [root@wangyuelou Python-2.7.2]# ls /usr/local/python27/ -al
6: total 28
7: drwxr-xr-x 6 root root 4096 Jul 14 00:21 .
8: drwxr-xr-x 20 root root 4096 Jul 14 00:17 ..
9: drwxr-xr-x 2 root root 4096 Jul 14 00:21 bin
10: drwxr-xr-x 3 root root 4096 Jul 14 00:21 include
11: drwxr-xr-x 4 root root 4096 Jul 14 00:21 lib
12: drwxr-xr-x 3 root root 4096 Jul 14 00:21 share
覆盖原来的python链接
1: [root@wangyuelou Python-2.7.2]# mv /usr/bin/python /usr/bin/python_old
2: [root@wangyuelou Python-2.7.2]# ln -s /usr/local/python27/bin/python /usr/bin/
3: [root@wangyuelou Python-2.7.2]# python
4: Python 2.7.2 (default, Jul 14 2011, 00:20:14)
5: [GCC 4.1.2 20080704 (Red Hat 4.1.2-50)] on linux2
6: Type “help”, “copyright”, “credits” or “license” for more information.
7: >>>
此处已经可以正常使用python2.7了
但是因为yum是使用的2.4的版本来用的,所以 还需要修改一下
1: [root@wangyuelou ~]# yum
2: There was a problem importing one of the Python modules
3: required to run yum. The error leading to this problem was:
4:
5: No module named yum
6:
7: Please install a package which provides this module, or
8: verify that the module is installed correctly.
9:
10: It’s possible that the above module doesn’t match the
11: current version of Python, which is:
12: 2.7.2 (default, Jul 14 2011, 00:20:14)
13: [GCC 4.1.2 20080704 (Red Hat 4.1.2-50)]
14:
15: If you cannot solve this problem yourself, please go to
16: the yum faq at:
17: http://wiki.linux.duke.edu/YumFaq
18:
19:
20: [root@wangyuelou Python-2.7.2]# vim /usr/bin/yum
21:
22: #!/usr/bin/python #修改此处为2.4的位置
23: [root@wangyuelou ~]# vim /usr/bin/yum
24:
25: #!/usr/bin/python2.4
26: [root@wangyuelou ~]# yum
27: Loaded plugins: fastestmirror
28: You need to give some command
29: usage: yum [options] COMMAND
30:
31: List of Commands:
32:
33: check-update Check for available package updates
34: clean Remove cached data
35: deplist List a package’s dependencies
36: downgrade downgrade a package
37: erase Remove a package or packages from your system
38: groupinfo Display details about a package group
39: groupinstall Install the packages in a group on your system
40: grouplist List available package groups
41: groupremove Remove the packages in a group from your system
42: help Display a helpful usage message
43: info Display details about a package or group of packages
44: install Install a package or packages on your system
45: list List a package or groups of packages
46: localinstall Install a local RPM
yum 又可以使用了

分类: Python编程 标签:

python做爬虫的常见问题总结

2015年9月6日 评论已被关闭

python做爬虫的常见问题总结
http://blog.sina.cn/dpool/blog/s/blog_98cf2a6f01015h79.html?vt=4
从接触爬虫到现在也整整一年了,谈不上什么精通,只是摸爬滚打、吃一堑长一智,就算在泥潭里,多少也了解点怎样滚,才能少沾点泥巴。这一年里维护改进着日规模高峰达80w、均度50w的垂直爬虫系统,写过一些一次性抓取的小脚本,参与过破解接口、本地执行js进而获取抓取数据,调研过伪登录、利用cookie进行抓取,写过简单的价格图片识别脚本,维护着基于模板截图的c++ ocr图片识别服务,开发了用上redis的基于特征统计判重服务,进行过局部的死链检测优化……其实回过头来看,一年的时间我还是浪费了很多。这些东西或多或少跟抓取、搜索都有一些关系。临近年关,没那么忙的话,就理一理吧。
1、最基本的代码
import urllib2
content = urllib2.urlopen(‘http://XXXX’).read()
2、最基本的结构和流程
调度、下载、抽取、入库
3、可能遇到的问题
两个原则:1)下回来了没?没有的话想尽千方百计搞到本地2)下回来了,就要相信一定能提取出来,只是麻烦与否的问题
1)被封禁
A、adsl代理
import urllib2
proxy_support = urllib2.ProxyHandler({‘http’:’http://XX.XX.XX.XX:XXXX’})
opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)
urllib2.install_opener(opener)
content = urllib2.urlopen(‘http://XXXX’).read()
其实以上几行代码是我从网上别处搞过来的,我一般小脚本那种一次性的抓取,用不上代理,而维护的垂直爬虫系统,下载那块主要借助的是pyqt4库,代理代码有一定耦合,就不在这里细说了,主要不是我自己写的,担心说不明白,那就不大好了,感兴趣的童鞋可以自己去研究pyqt4库,都是有很好支持的
B、控制对同一站点的访问频率(要是让它sleep、要么让它抓别的站点)
4、爬虫的自我伪装
对于需要登录的一般有以下几种处理方法:
1)直接模拟登录后的动作,利用cookie、携带用户信息等方式发起请求,绕过登录动作
2)机器人自动登录
3)直接使用webkit和js去操作登录
这里主要说一下前两种,不是因为对它们多熟,而是第三种我暂时压根没用过,⊙﹏⊙b汗
工具:firefox+httpfox
机器人自动登录:
这个东东其实原理很简单,就是程序post_data真实用户信息发起请求,至于最后能否成功登录获取登录后的信息,个人经验觉得跟对方校验严格程度有关,有些网站post_data有一些乱七八糟的数据值,你无法分析清楚,尽管携带真实用户信息请求,也总是返回用户名和密码不一致。而有的简单就容易攻破。
我实际工作中用的是直接模拟登录后访问的方法。大体代码如下:
import urllib,urllib2,cookielib
mycookie = urllib2.HTTPCookieProcessor(cookielib.CookieJar())
openner = urllib2.build_opener(mycookie)
request = urllib2.Request(‘http:/*’)
request.add_header(‘Accept-Language’, ‘zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3’)
request.add_header(‘Connection’, ‘keep-alive’)
request.add_header(‘Accept-Encoding’, ‘gzip, deflate’)
request.add_header(‘X-Requested-With’, ‘XMLHttpRequest’)
request.add_header(‘Referer’, ‘http://****’)
cookie_str = ‘***’
request.add_header(‘Cookie’, cookie_str)
html_src = openner.open(request).read()
到这里基本已经完事,但你偶尔还会遇到一个问题:乱码
解决方法:
import gzip
from gzip import *
import os, io
import StringIO
html_data = GzipFile(fileobj=StringIO(html_src), mode=’r’).read()
5、多线程加速
其实这一块本身跟爬虫没多大关系了,对我这种菜鸟来讲,需要注意一点就是仔细理解线程,别把线程和函数调用混淆。建议使用线程池,至于具体代码,这个东东网上多去了,就不啰嗦了。
6、一些琐碎的东东
pyqt4本地模拟浏览器执行js
from PyQt4.QtWebKit import QWebPage, QWebElement
from PyQt4.QtCore import QCoreApplication, QThread, QUrl, SIGNAL, QTimer
app = QApplication(sys.argv)
downloader = QWebPage()
with open(‘***.js’) as f:
js = f.read()
js = js.replace(‘{{address}}’, encoded_lat_lng)
js_res_str = unicode(downloader.mainFrame().evaluateJavaScript(js).toString()
抽取失败怎么查?
1)检查下载回本地内容
是否下载完全?下载是否正确(即是否是自己想要的内容)?是否包含所要抽的内容?
有时由于网络原因,它会下载不全;有时由于封禁等会导致下载非所要内容,甚至会被通知“机器人检查”;有时由于js加载等浏览器本地处理,导致你在页面能看到,并不代表你就已经下载回所看到的内容了。其实web是这样的,网页文本是一部分,会随着当次请求返回,而其余的类似css\js\图片等等,第一次获取到的只是url等信息,也就是说我们从浏览器看到的一次请求实际上是包含了n次请求的,或前或后最后统一由浏览器加载呈现。
2)检查xpath是否正确
当然也可以是其他的定位方法,这里拿xpath举例。xpath是否准确定位到所需信息?
3)检查提取方法是否正确
可以用正则,也可以用python自带的字符串处理函数,这个看你喜欢,但貌似正则看起来更美观些。期间我遇到情况有:信息藏在利用工具获取的xpath节点的父节点、信息做了简单防抓取截断甚至js等处理……这些情况可以仔细分析网页源码加以针对解决,再唠叨一句,记住——只要到了本地,那就是你的天下,有就一定能抽出来。
4)图片抽取失败呢?
首先看是否进行了全局抽取,有的为了防止抓到广告图片,限定了抽取范围,而一旦对方变了模板,此时的图片抽取会失效。其次就是程序逻辑了,是否进行了次数限制,比如前边弄了5张,就不去扫描下面的内容了。
除了封禁,对方还会采取哪些常见的信息保护措施?
1)信息图片化
这样即使你抓到该图片,要想获取信息,也得费一番劲了。常见的比如价格图片、电话图片、验证码等等。而作为抓取方,这就得依赖后端服务了,比如图片识别ocr,这个就不在这里说了。
2)有意信息截断分开存储
拿电话图片举例,我遇到过前三位存一个地方,后八位显示星号,用户通过点击button获取完整的电话号码,其实这纯粹是个防傻瓜机器人的trick,你要想复杂的做可以模拟js点击,再获取。但更简单的方法是分析其网页源码,找到分散的部分,直接正则分别提取,再拼接即可。
3)对非登录用户不展示
这个的话,其实我现在没有什么太好的办法。临时抓取可以利用上面的破解登录的方法,但长期来看的话,别人想kill掉你是很容易的,因为你短时间内同一账号大规模的访问这个是极其容易被发现的,除非对方弱智或者压根不想管你。不然就是你有成千上万个马甲,你要搞到这种程度,我也只能拜服了。应个景,12306要想封插件个人觉得技术肯定不是问题,很简单啊,你一个账号10、20分钟五秒钟刷一次,避免误判,我忍了,可你连续几小时这样,我立马就给你封了。O(∩_∩)O哈哈~,其实他是不想真那么干罢了。
……
本篇的话感觉主要关注一些比较细节方面的东西即可,至于爬虫系统的方面东东再起一篇吧
系统架构(从种子到模板到入库到死链检查整个一套机制如何运转)
调度、如何让其平稳长时间运行(包括出去了回不来、出不去、新比例)站点如何做到平衡
downloader主要是多进程、异步转同步、pyqt webkit渲染
抽取的模板机制,如何保证关系不混乱、列表页、详情页、抽取field
入库就没什么太多可讲的了
引擎是怎么统领全局的
……

分类: Python编程 标签:

Python: 在Unicode和普通字符串之间转换

2015年9月1日 评论已被关闭

Python: 在Unicode和普通字符串之间转换
http://blog.sina.com.cn/s/blog_5487728b010099ji.html
1.1. 问题 Problem
You need to deal with data that doesn’t fit in the ASCII character set.

你需要处理不适合用ASCII字符集表示的数据.
1.2. 解决 Solution
Unicode strings can be encoded in plain strings in a variety of ways, according to whichever encoding you choose:

Unicode字符串可以用多种方式编码为普通字符串, 依照你所选择的编码(encoding):

<!– Inject Script Filtered –> Toggle line numbers
1 #将Unicode转换成普通的Python字符串:”编码(encode)” 2 unicodestring = u”Hello world” 3 utf8string = unicodestring.encode(“utf-8”) 4 asciistring = unicodestring.encode(“ascii”) 5 isostring = unicodestring.encode(“ISO-8859-1”) 6 utf16string = unicodestring.encode(“utf-16”) 7 8 9 #将普通的Python字符串转换成Unicode: “解码(decode)” 10 plainstring1 = unicode(utf8string, “utf-8”) 11 plainstring2 = unicode(asciistring, “ascii”) 12 plainstring3 = unicode(isostring, “ISO-8859-1”) 13 plainstring4 = unicode(utf16string, “utf-16”) 14 15 assert plainstring1==plainstring2==plainstring3==plainstring4

1.3. 讨论 Discussion
If you find yourself dealing with text that contains non-ASCII characters, you have to learn about Unicode梬hat it is, how it works, and how Python uses it.

如果你发现自己正在处理包含非ASCII码字符的文本, 你必须学习Unicode,关于它是什么,如何工作,而且Python如何使用它。
Unicode is a big topic.Luckily, you don’t need to know everything about Unicode to be able to solve real-world problems with it: a few basic bits of knowledge are enough.First, you must understand the difference between bytes and characters.In older, ASCII-centric languages and environments, bytes and characters are treated as the same thing.Since a byte can hold up to 256 values, these environments are limited to 256 characters.Unicode, on the other hand, has tens of thousands of characters.That means that each Unicode character takes more than one byte, so you need to make the distinction between characters and bytes.

Unicode是一个大的主题。幸运地,你并不需要知道关于Unicode码的每件事,就能够用它解决真实世界的问题: 一些基本知识就够了。首先,你得了解在字节和字符之间的不同。原先,在以ASCII码为中心的语言和环境中,字节和字符被当做相同的事物。由于一个字节只能有256个值,这些环境就受限为只支持 256个字符。Unicode码,另一方面,有数万个字符,那意谓着每个Unicode字符占用多个字节,因此,你需要在字符和字节之间作出区别。
Standard Python strings are really byte strings, and a Python character is really a byte.Other terms for the standard Python type are “8-bit string” and “plain string.”,In this recipe we will call them byte strings, to remind you of their byte-orientedness.

标准的Python字符串确实是字节字符串,而且一个Python字符真的是一个字节。换个术语,标准的 Python字符串类型的是 “8位字符串(8-bit string)”和”普通字符串(plain string)”. 在这一份配方中我们把它们称作是字节串(byte strings), 并记住它们是基于字节的。
Conversely, a Python Unicode character is an abstract object big enough to hold the character, analogous to Python’s long integers.You don’t have to worry about the internal representation;the representation of Unicode characters becomes an issue only when you are trying to send them to some byte-oriented function, such as the write method for files or the send method for network sockets.At that point, you must choose how to represent the characters as bytes.Converting from Unicode to a byte string is called encoding the string.Similarly, when you load Unicode strings from a file, socket, or other byte-oriented object, you need to decode the strings from bytes to characters.

相反地,一个Python Unicode码字符是一个大到足够支持(Unicode)字符的一个抽象对象, 类似于Python中的长整数。 你不必要为内在的表示担忧; 只有当你正在尝试把它们传递给给一些基于字节的函数的时候,Unicode字符的表示变成一个议题, 比如文件的write方法或网络套接字的send 方法。那时,你必须要选择该如何表示这些(Unicode)字符为字节。从Unicode码到字节串的转换被叫做编码。同样地,当你从文件,套接字或其他的基于字节的对象中装入一个Unicode字符串的时候,你需要把字节串解码为(Unicode)字符。
There are many ways of converting Unicode objects to byte strings, each of which is called an encoding.For a variety of historical, political, and technical reasons, there is no one “right” encoding.Every encoding has a case-insensitive name, and that name is passed to the decode method as a parameter. Here are a few you should know about:

将Unicode码对象转换成字节串有许多方法, 每个被称为一个编码(encoding)。由于多种历史的,政治上的,和技术上的原因,没有一个 “正确的”编码。每个编码有一个大小写无关的名字,而且那一个名字被作为一个叁数传给解码方法。这里是一些你应该知道的:

The UTF-8 encoding can handle any Unicode character.It is also backward compatible with ASCII, so a pure ASCII file can also be considered a UTF-8 file, and a UTF-8 file that happens to use only ASCII characters is identical to an ASCII file with the same characters.This property makes UTF-8 very backward-compatible, especially with older Unix tools.UTF-8 is far and away the dominant encoding on Unix.It’s primary weakness is that it is fairly inefficient for Eastern texts.
UTF-8 编码能处理任何的Unicode字符。它也是与ASCII码向后兼容的,因此一个纯粹的ASCII码文件也能被考虑为一个UTF-8 文件,而且一个碰巧只使用ASCII码字符的 UTF-8 文件和拥有同样字符的ASCII码文件是相同的。这个特性使得UTF-8的向后兼容性非常好,尤其使用较旧的 Unix工具时。UTF-8 无疑地是在 Unix 上的占优势的编码。它主要的弱点是对东方文字是非常低效的。
The UTF-16 encoding is favored by Microsoft operating systems and the Java environment.It is less efficient for Western languages but more efficient for Eastern ones.A variant of UTF-16 is sometimes known as UCS-2.
UTF-16 编码在微软的操作系统和Java环境下受到偏爱。它对西方语言是比较低效,但对于东方语言是更有效率的。一个 UTF-16 的变体有时叫作UCS-2 。
The ISO-8859 series of encodings are 256-character ASCII supersets.They cannot support all of the Unicode characters;they can support only some particular language or family of languages.ISO-8859-1, also known as Latin-1, covers most Western European and African languages, but not Arabic.ISO-8859-2, also known as Latin-2,covers many Eastern European languages such as Hungarian and Polish.
ISO-8859编码系列是256个字符的ASCII码的超集。他们不能够支援所有的Unicode码字符; 他们只能支援一些特别的语言或语言家族。ISO-8859-1, 也既Latin-1,包括大多数的西欧和非洲语言, 但是不含阿拉伯语。ISO-8859-2,也既Latin-2,包括许多东欧的语言,像是匈牙利语和波兰语。
If you want to be able to encode all Unicode characters, you probably want to use UTF-8.You will probably need to deal with the other encodings only when you are handed data in those encodings created by some other application.

如果你想要能够编码所有的Unicode码字符,你或许想要使用UTF-8。只有当你需要处理那些由其他应用产生的其它编码的数据时,你或许才需要处理其他编码。

分类: Python编程 标签: ,

秘密武器:Visual Studio可作为Python IDE

2015年8月27日 评论已被关闭

秘密武器:Visual Studio可作为Python IDE

http://dev.yesky.com/489/35156489.shtml

英文原文:One of Microsoft’s Best-Kept Secrets – Python Tools for Visual Studio (PTVS)

众所周知,Visual Studio 是开发 Windows 平台产品的利器,是C#、ASP.NET 等应用开发的首选 IDE。其实,Visual Studio 也可作为 Python IDE 来使用。你只需在 Visual Studio 的基础上,安装 PTVS(Python Tools for Vistul Studio)插件,即可快速将 Visual Studio 变成 Python IDE 来使用。

04213108-29c78b3bb5914e6c8acf885422973c6d

  PTVS 部分功能简介

PTVS 是一个自由/开源插件,它支持 CPython、IronPython、编辑、浏览、智能感知、混合的 Python/ C++ 调试、性能分析、HPC 集群、IPython、Django、以及适用于 Windows、Linux 和 MacOS 的客户端的云计算。

PTVS 能够识别到已安装的 Python 引擎,用户可以很容易的在多个引擎之间进行切换。在这里,用户可以看到,VS 可以为每个版本的 Python 或 IronPython 自动更新相应的数据库。

04213108-62afd97b9072487f9e360255eaf41cda

  PTVS 集成了 Python 单元测试及 VS 单元测试 UI,能够清楚地识别出用户在进行单元测试。

04213108-90507b2b24334ea08b10b52343516af7

  安装 PTVS

电脑上需要具备 VS、PTVS 和 Python 这三个平台软件安装包,这是安装的前提。这里有一个完整的 PTVS 安装说明。

如果你没有安装 Visual Studio,可以查找包含 Visual Studio Shell 的 PTVS。这里为你提供了”PyToolsIntegrated”、Python 可供你查阅下载使用。

如果你已经安装了 VS 2010 或 VS 2012 或 VS 2013,这时需要查阅与该版本相应的 PTVS。这里以 VS2013、Python 3.3、PTVS 为例说明。

04213108-3c28a274e54343b8b2bfae353f65b5ea

  基于 Visual Studio 平台开发的 Django 应用程序

如果你是一位 Django(Python 的一个 Web 框架)Web 的开发人员,那么你可以使用 VS 来开发应用程序。

点击文件新建 Django 应用程序,这时从解决方案资源管理器中获得了一个新的 ython 虚拟环境,接着 Visual Studio 为你自动安装 pip(Python 包管理器)。

04213108-e9aa56d2edcc4335a3cee7087a5f7ba9 04213109-ce88825ff83e4f9ba47d9ea9b7d3d4d8

  这时右击“dev“,就如同 NuGet 一样,安装了 Django

04213109-2949d28946e6499ab8af62b1cd3c1606

  由于 Django 运行的程序比较多,所以运行起来需花费一些时间,在 Django 中完成了 Hello World 程序的编写后,从 Visual Studio 平台中启动并运行这个 Hello Django 程序。

 

分类: Python编程 标签:

VS2015中Python环境搭建

2015年8月27日 评论已被关闭

VS2015中Python环境搭建

http://pgqlife.info/2015/05/05/VS-Python/

前言

Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。

Python的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。

  • Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于PHPPerl语言。
  • Python 是交互式语言: 这意味着,您可以在一个Python提示符,直接互动执行写你的程序。
  • Python 是面向对象语言: 这意味着Python支持面向对象的风格或代码封装在对象的编程技术。
  • Python是初学者的语言:Python 对初级程序员而言,是一种伟大的语言,它支持广泛的应用程序开发,从简单的文字处理到 WWW 浏览器再到游戏。

环境准备

我是在Win8.1下搭建的开发环境。我是用的是VS2015RC 版,还需要准备 PythonPTVS

1、http://pytools.codeplex.com/ 下载工具,下载之后进行安装即可,我这里下载的是

67506398gw1ert5pt0susj20dv0at3zz

2、https://www.python.org/download/下载Python
67506398gw1ert5qzghfbj20dv0bxmyz

3、打开VS2015,新建项目

67506398gw1ert5sxb2kij20qj0g6q7a

确定建立项目

Hello World运行成功

67506398gw1ert5txj82lj20vl08pjto

然后就可以用VS这个宇宙间最强大的编辑器来学习,体会其中的快乐。

分类: Python编程 标签:

python pip包管理

2015年5月9日 评论已被关闭

python pip包管理

 

python pip包管理 – 技术成就梦想 – 51CTO技术博客

pip 是一个安装和管理 Python 包的工具 , 是 easy_install 的一个替换品。本文将详细说明 安装 pip 的方法和 使用 pip 的一些基本操作如安装、更新和卸载 python 包。

distribute是setuptools的取代(Setuptools包后期不再维护了),pip是easy_install的取代。

pip的安装需要setuptools 或者 distribute,如果你使用的是Python3.x那么就只能使用distribute因为Python3.x不支持setuptools。

见下图:

115413273

#wget http://python-distribute.org/distribute_setup.py

#python distribute_setup.py

setuptools安装:

#https://pypi.python.org/packages/source/s/setuptools/

#wget –no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz

#tar zxvf setuptools-1.4.2.tar.gz

#cd setuptools-1.4.2;python setup.py install;easy_install –version

安装Pip:

wget –no-check-certificate https://pypi.python.org/packages/source/p/pip/pip-1.4.1.tar.gz

tar zxvf pip-1.4.1.tar.gz

cd pip-1.4.1

python setup.py install

测试:

pip install simplejson

下面来看一下pip的使用:

安装特定版本的package,通过使用==, >=, <=, >, <来指定一个版本号。

pip install ‘Markdown<2.0’

pip install ‘Markdown>2.0,<2.0.3’

升级包到当前最新的版本,可以使用-U 或者 –upgrade

pip install -U Markdown

卸载包

pip uninstall Markdown

查询包

pip search “multiprocessing”

列出安装的packages

$ pip freeze

本文出自 “技术成就梦想” 博客,请务必保留此出处http://hxl2009.blog.51cto.com/779549/1334664

分类: Python编程 标签:

Python入门

2015年5月9日 评论已被关闭

Python入门
http://blog.csdn.net/ponder008/article/details/6581604
一、Python全景图

1、程序由模块组成

2、模块包含语句

3、语句包含表达式

4、表达式建立并处理对象

二、Python中的基本数据类型和标准操作

内置对象类型:

数字
1234,3.1415,999L,3+4j,Decimal
字符串
‘spam’,”guido’s”
列表(list)
[1, [2, ‘three’], 4]
字典(dictionary)
{‘food’:’spam’, ‘taste’:’yuan’}
元组
(1,’spam’,4,’u’)
文件
myfile = open(‘eggs’, ‘r’)
其它类型
集合、类型、None、布尔型

标准操作:合并、分片、排序、映射。

备注:元组和列表十分类似,只不过元组不能被修改,类似一个常量。

三、Python的关键字

and
‘与’操作
if
条件语句
as
与‘with’一起使用,获得测试模块的__enter__结果。
import
引入模块
assert
插入调试信息,如果表达式不为真,就跑出异常。
in
x in y,比较两个对象,随着对象类型不同,有不同的表现。
break
跳出循环
is
判断两个实例是否是同一个, 即是否是对同一对象的引用。(Python中所有类型都通过引用存取, 即便是”基本类型”也不例外)
class
类的标识符
lambda
匿名函数。g = lambda x : x**2
continue
跳过本次循环
not
“非”操作
def
函数的标识符
or
“或”操作
del
删除变量或者变量的某个成员
pass
占位符,不执行任何操作。
elif
跟if配合使用
print
打印对象
else
跟if配合使用
raise
抛出异常
except
跟try配合使用,但try模块跑出异常时被执行
return
返回
exec
用来执行储存在字符串或文件中的Python语句
try
接收异常
finally
跟try配合使用,无论异常发生与否都会被执行。
while
循环语句
for
循环语句
with
with是一个控制流语句,跟if/for/while/try之类的是一类的,with可以用来简化try finally代码,看起来可以比try finally更清晰。
from
跟import配合使用
yield
用来定义生成器(Generator)。其具体功能类似return,从函数里返回一个值,不同之处是用yield返回之后,可以让函数从上回yield返回的地点继续执行。也就是说,yield返回函数,交给调用者一个返回值,然后再“瞬移”回去,让函数继续运行, 直到下一条yield语句再返回一个新的值。所有的值保存在生成器里面,生成器调用next()方法可以获得这些返回值。
global
如果你想要为一个定义在函数外的变量赋值,那么你就得告诉Python这个变量名不是局部的,而是 全局 的。

在python shell中调用了help()进入help模式,在提示符下输入“keywords”就可以看到一个Python关键字列表。以上是2.6的关键字列表。

四、Python主要的应用领域

系统编程:可以替换各个平台的shell工具,比如windows下的cmd等等,并提供更为强大的功能,因为相较于shell语言,python是一门更为成熟的语言,对函数等支持的很好。

用户图形接口:常用的库为Tkinter和wxWidget

Internal脚本:有很多网站开发的框架,目前最流行的为Django。

组件集成:作为“胶水语言”,可以用Python控制用其它语言(如C)编写的模块的行为,也可以将Python嵌入其它语言中,在不需要重新编译整个产品或者分发源码的情况下,能够进行产品的单独定制。

数据库编程:Python提供了对所有主流关系数据库系统的接口,如MySQL、SQLite等。

快速原型:用来做系统原型。

数值计算和科学计算编程:利用NumPy等Python模块可以进行数值计算和科学计算方面的操作。

此外在游戏(pygame/Panda3D)、图像(PIL)、人工智能(PyRo)、XML、机器人等领域都扮演着组件集成的角色,用C编写库组件,然后用Python作为其前端。

参考资料:

《Python学习手册(第三版)》

分类: Python编程 标签:

如何使用和制作 Python 安装模块(setup.py)

2015年5月9日 评论已被关闭

如何使用和制作 Python 安装模块(setup.py)
http://blog.csdn.net/ponder008/article/details/6592719
Python模块的安装方法:

1. 单文件模块:直接把文件拷贝到$python_dir/lib

2. 多文件模块,带setup.py:python setup.py install

3. egg文件,类似Java的jar:
1) 下载ez_setup.py,运行python ez_setup
2) easy_install *.egg

虽然Python的模块可以拷贝安装,但是一般情况下推荐制作一个安装包,即写一个setup.py文件来安装。

setup.py文件的使用:
% python setup.py build #编译
% python setup.py install #安装
% python setup.py sdist #制作分发包
% python setup.py bdist_wininst #制作windows下的分发包
% python setup.py bdist_rpm

setup.py文件的编写:
setup.py中主要执行一个 setup函数,该函数中大部分是描述性东西,最主要的是packages参数,列出所有的package,可以用自带的find_packages来动态获取package。所以setup.py文件的编写实际是很简单的。

简单的例子:

setup.py文件:
from setuptools import setup, find_packages
setup(
name=”mytest”,
version=”0.10″,
description=”My test module”,
author=”Robin Hood”,
url=”http://www.csdn.net”,
license=”LGPL”,
packages= find_packages(),
scripts=[“scripts/test.py”],
)

mytest.py文件:
import sys
def get():
return sys.path

scripts/test.py文件:
import os
print os.environ.keys()

setup中的scripts表示将该文件放到 Python的Scripts目录下,可以直接用。OK,简单的安装成功,可以运行所列举的命令生成安装包,或者安装该python包。

本机测试成功(win32-python25)!

转自:
http://blog.csdn.net/foyuan/archive/2007/11/14/1883924.aspx
http://www.okpython.com/bbs/thread-3103-1-1.html

分类: Python编程 标签:

#!/usr/bin/env python与#!/usr/bin/python的区别

2015年5月9日 评论已被关闭

#!/usr/bin/env python与#!/usr/bin/python的区别
http://blog.csdn.net/wh_19910525/article/details/8040494
脚本语言的第一行,目的就是指出,你想要你的这个文件中的代码用什么可执行程序去运行它,就这么简单

#!/usr/bin/python是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python解释器;
#!/usr/bin/env python这种用法是为了防止操作系统用户没有将python装在默认的/usr/bin路径里。当系统看到这一行的时候,首先会到env设置里查找python的安装路径,再调用对应路径下的解释器程序完成操作。
#!/usr/bin/python相当于写死了python路径;
#!/usr/bin/env python会去环境设置寻找python目录,推荐这种写法

分类: Python编程 标签:

CentOS 安装Python 2.7

2015年5月9日 评论已被关闭

CentOS 安装Python 2.7
http://blog.csdn.net/xugangjava/article/details/15811617
原文地址http://www.jbxue.com/LINUXjishu/9614.html
近期的开发需求中,需要用到python 2.7.*,但是CentOS 6.4中默认使用的python版本是2.6.6,故需要升级版本。
下面是完整的安装步骤,供大家参考。
1,首先,安装GCC:

复制代码代码示例:
yum install gcc gcc-c++
2,下载python-2.7.5.tar.gz文件,修改文件权限:

复制代码代码示例:
chmode +x python-7.5.tar.gz
3,解压tar文件

复制代码代码示例:
tar -xzvf python-2.7.5.tar.gz
4,编译安装

复制代码代码示例:
cd python-2.7.5
./configure –prefix=/usr/local/python27 ### 注意:安装在新目录,防止覆盖系统默认安装的python
make && make install
5,建立软连接,使系统默认的python指向python27

复制代码代码示例:
mv /usr/bin/python /usr/bin/python2.6.6.old
ln -s /usr/local/bin/python27 /usr/bin/python
到此,完成python的安装与升级。
查看下python的版本:

复制代码代码示例:
# python -V
Python 2.7.5
注意,此时使用yum命令会有问题,即yum不能正常工作:
# yum list
There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:
No module named yum
Please install a package which provides this module, or
verify that the module is installed correctly.
It’s possible that the above module doesn’t match the
current version of Python
原因在于:
yum默认使用的python版本是2.6.6,现在的python版本是2.7.5,只需要修改下yum的默认python配置版本即可:
#vi /usr/bin/yum
将文件头部的#!/usr/bin/python修改为:
#!/usr/bin/python2.6

分类: Python编程 标签:

python基础教程 centos5.5下搭建python开发运行环境

2015年5月9日 评论已被关闭

python基础教程 centos5.5下搭建python开发运行环境

http://www.tuicool.com/articles/36nYFnF

 

写一篇关于 python基础教程  ,由于python出色的科学计算库,笔者把之前在c#中开发的内容,转移到python下。原因有两点:1. 一些科学计算,包括人工智能库,c#很多没有现成的,自己写代码成本太高;2. python可以在windows、linux、android几乎所有平台下运行,兼容性相当不错,省去开发多个版本的麻烦。本文从第一步开始,在centos5.5 下 搭建python开发运行环境

Qn2a2apython基础教程

 python基础教程 搭建运行环境

首先想说的是,centos5.5操作系统版本比较老了,它默认安装了python2.4,与其相关联的如yum等,则要求必须使用python2.4。因此,在安装python更高版本时,必须要注意与老软件的兼容问题。

安装方法很简单,直接使用yum即可:

yum install python27
yum install python-pip

安装完成后,需要修改yum服务的scripts:

RrMnyq3vim python2.4

[root@www.cnphp.info ~]$ vim /usr/bin/yum
把#!/usr/bin/python 修改为:
#!/usr/bin/python2.4

安装pip和easy_install

python的便利性在于它有N多个写好的库,所以安装pip和easy_install是必须的,它们用来下载、安装python扩展库。centos上的pip安装名称和其他系统有些不一样。

yum intall python-pip

不过笔者在使用pip-python是确出现下列错误。

[root@www.cnphp.info ~]$ pip-python install requests
Traceback (most recent call last):
File “/usr/bin/pip-python”, line 5, in <module>
from pkg_resources import load_entry_point
File “build/bdist.linux-x86_64/egg/pkg_resources.py”, line 2749, in <module>
File “build/bdist.linux-x86_64/egg/pkg_resources.py”, line 444, in _build_master
File “build/bdist.linux-x86_64/egg/pkg_resources.py”, line 725, in require
File “build/bdist.linux-x86_64/egg/pkg_resources.py”, line 628, in resolve
pkg_resources.DistributionNotFound: pip==0.8

出现上述错误主要是由于python的版本太过老了,需要下载最新版本的setuptools

wget https://pypi.python.org/packages/source/s/setuptools/setuptools-3.5.1.zip

安装之后,还是会出现错误:

ImportError: No module named pkg_resources
returned non-zero exit status 1

无奈之下,只好去安装easy_install并安装。

python ez_setup.py –insecure enable

whereis easy_install
ll /usr/bin | grep easy_install
-rwxr-xr-x 1 root root 320 May 29 21:38 easy_install
-rwxr-xr-x 1 root root 288 May 25 2008 easy_install-2.4
-rwxr-xr-x 1 root root 328 May 29 21:38 easy_install-2.7

至此,python运行环境已经建好,开始执行hello world吧^_^

Summary
jUB77v
Article Name

python基础教程 centos5.5下搭建python开发运行环境

Author
freemouse
Description

写一篇关于 python基础教程 ,笔者把之前在c#中开发的内容,转移到python下。原因有两点:1. 一些科学计算,包括人工智能库,c#很多没有现成的,自己写代码成本太高;2. python可以在windows、linux、android几乎所有平台下运行,兼容性相当不错,省去开发多个版本的麻烦。

分类: Python编程 标签:

在Linux CentOS 6.6上安装Python 2.7.9

2015年5月9日 评论已被关闭

在Linux CentOS 6.6上安装Python 2.7.9
http://www.cnblogs.com/dudu/p/4294238.html
CentOS 6.6自带的是Python 2.6.6,而编译llvm需要Python 2.7以上。

checking for python… /usr/bin/python
checking for python >= 2.7… not found
configure: error: found python 2.6.6 (/usr/bin/python); required >= 2.7
yum中最新的也是Python 2.6.6,只能下载Python 2.7.9的源代码自己编译安装。

操作步骤如下:

1)安装devtoolset

yum groupinstall “Development tools”
2)安装编译Python需要的包包

yum install zlib-devel
yum install bzip2-devel
yum install openssl-devel
yum install ncurses-devel
yum install sqlite-devel
3)下载并解压Python 2.7.9的源代码

cd /opt
wget –no-check-certificate https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tar.xz
tar xf Python-2.7.9.tar.xz
cd Python-2.7.9
4)编译与安装Python 2.7.9

./configure –prefix=/usr/local
make && make altinstall
5)将python命令指向Python 2.7.9

ln -s /usr/local/bin/python2.7 /usr/local/bin/python
6)检查Python版本

sh
sh-4.1# python -V
Python 2.7.9
【参考资料】

Installing python 2.7 on centos 6.3
https://github.com/h2oai/h2o/wiki/Installing-python-2.7-on-centos-6.3.-Follow-this-sequence-exactly-for-centos-machine-only

分类: Python编程 标签:

python升级后yum报错修复方法

2015年5月9日 评论已被关闭

python升级后yum报错修复方法
http://www.jbxue.com/os/
升级新版本python后,yum安装文件时会报错,原因在于yum是python编写,python版本不一致导致脚本运行错误所致,可以修改yum文件解决问题,需要的朋友参考下。
python升级后yum报错修复方法

升级python版本后,运行yum:

# yum -y install openssl
提示:

There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:

No module named yum

Please install a package which provides this module, or
verify that the module is installed correctly.

It’s possible that the above module doesn’t match the
current version of Python, which is:
2.7.3 (default, Jul 15 2014, 16:52:36)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-48)]

If you cannot solve this problem yourself, please go to
the yum faq at:
http://wiki.linux.duke.edu/YumFaq

原因:yum和Python是依赖关系,yum是python的模块,需要修改yum解决此问题。

yum修复过程如下:

1、查看python的安装路径

# python
Python 2.7.3 (default, Jul 15 2014, 16:52:36)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux2
Type “help”, “copyright”, “credits” or “license” for more information.
>>>
# whereis python
python: /usr/bin/python2.4 /usr/bin/python /usr/bin/python2.6 /usr/lib/python2.4 /usr/local/bin/python
/usr/local/bin/python2.6-config /usr/local/bin/python3.3-config /usr/local/bin/python3.3 /usr/local/bin/python3.3m
/usr/local/bin/python3.3m-config /usr/local/bin/python2.6 /usr/local/lib/python2.4 /usr/local/lib/python3.3
/usr/local/lib/python2.6 /usr/include/python2.4 /usr/share/man/man1/python.1.gz
2、修改yum
# vim /usr/bin/yum
将 #!/usr/bin/python 改成 #!/usr/bin/python2.4
【保存并退出】

3、测试yum安装,成功;

附,python升级导致yum不可用的解决方法
在一台服务器上yum安装RRDTool,发现yum报错,不能使用。

登陆服务器检查,发现python被人从2.4升级到了2.6,,使用yum报错:ImportError: No module named rpm
显示yum的python脚本无法导入rpm包

手动修改/usr/bin/yum脚本头部
将#!/usr/bin/python改成#!/usr/bin/python2.4

附2,执行yum报错:Insufficient server config – no servers found. Aborting.

终极解决办法:
1、使用rpm将python2.6降级,注意rpm -e掉python2.6后,需要将/usr/bin/下的python和python2做个软件到/usr/bin/python2.4

2、重新安装yum:

rpm -ivh python-iniparse-0.2.3-4.el5.noarch.rpm
rpm -ivh yum-metadata-parser-1.1.2-3.el5.centos.x86_64.rpm
rpm -ivh yum-fastestmirror-1.1.16-14.el5.centos.1.noarch.rpm yum-3.2.22-26.el5.centos.noarch.rpm
3、清理一些垃圾源
最终yum update成功。

附3,python升级导致yum命令无法使用的解决方案

操作过程:

[root@web-server ~]# yum
There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:
No module named yum
Please install a package which provides this module, or
verify that the module is installed correctly.
It’s possible that the above module doesn’t match the
current version of Python, which is:
2.5.4 (r254:67916, Feb 24 2010, 10:03:49)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)]
If you cannot solve this problem yourself, please go to
the yum faq at:
http://wiki.linux.duke.edu/YumFaq
解决方法:
查找yum文件,并编辑此py文件

[root@web-server ~]# which yum
/usr/bin/yum
[root@web-server ~]# vi /usr/bin/yum

#!/usr/bin/python
改为:
#!/usr/bin/python2.4

保存文件,重启yum,再次执行成功。

另外的可能原因,无法使用yum,就是/usr/bin下的python、python2、python2.4三个文件一定不能改变。
yum只是基于python语言,跟版本并没有关系,但是升级过程中确实会出现问题,具体机制大家可以深入研究下。

分类: Python编程 标签: