标签 python 下的文章

使用python多线程threadpool遇到"'NoneType' object has no attribute 'Empty'"的问题

代码如下:

#!/usr/bin/env python
# coding=utf8


import threadpool as tp

args = []
for i in range(1, 20):
    args.append(i)


def start(args):
    print '[+] %s' % args
    return True

pool = tp.ThreadPool(20)
reqs = tp.makeRequests(start, args)
[pool.putRequest(req) for req in reqs]
pool.wait()

执行后报错信息如下:

Exception in thread Thread-8 (most likely raised during interpreter shutdown):Exception in thread Thread-7 (most likely raised during interpreter shutdown):

省略部分信息

<type 'exceptions.AttributeError'>: 'NoneType' object has no attribute 'Empty'

- 阅读剩余部分 -

python关于json的操作

将json转换为dict字典

import json
json_data = open("data.json").read()
print json.loads(json_data)

将dict字典转换为json

import json
data = {'key': 'a', 'value': 'b'}
print json.dumps(data)

windows环境下安装pip

安装pip时需要用到setuptools,所以需要先安装setuptools。

1. 安装setuptools

1. 下载easy_install. [点击下载](https://bootstrap.pypa.io/ez_setup.py)
2. 进入CMD命令行,执行命令 `python ez_setup.py`

2. 安装pip

1. 下载pip. [点击下载](https://pypi.python.org/pypi/pip#downloads)
2. 解压缩.
3. 进入CMD命令行,执行命令 `python setup.py install`
4. 设置环境变量,在末尾新增 `;C:\Python27\Scripts`

3.验证安装是否成功

在CMD命令行下执行命令
pip --version

输出结果
pip 6.0.7 from C:\Python27\lib\site-packages\pip-6.0.7-py2.7.egg (python 2.7)

python和php函数参数的不同

之前一直只用过php,由于项目中需要python版的sdk,第一次上手写python。
期间遇到了一个函数参数的问题,整理记录一下。

下面分别以php和python进行对比。

测试一

php代码:

function test($a) {
    $a = 'test2';
}

$a = 'test';
print_r($a);
// output test
test($a);
print_r($a);
// output test

python代码:

>>> def test(a):
    a = 'test2'

>>> a = 'test'
>>> a
'test'
>>> test(a)
>>> a
'test'
>>> 

测试二

php代码:

function test($a) {
    $a['age'] = 10;
}

$a = array(
    'name' => 'test'
);
print_r($a);
// output Array ( [name] => test )
test($a);
print_r($a);
// output Array ( [name] => test )

python代码:

>>> def test(a):
    a['age'] = 10

>>> a = {'name': 'test'}
>>> a
{'name': 'test'}
>>> test(a)
>>> a
{'age': 10, 'name': 'test'}
>>> 

由上可以看出,在php里,函数内部的变量不会影响到函数外部的变量。
而在python里,函数内部的变量可以影响到外部的变量。

原因分析:

还是先看几个测试:

>>> x=2
>>> id(2)
33488572
>>> id(x)
33488572
>>> x=3
>>> id(3)
33488560
>>> id(x)
33488560
>>> 

在Python中,单一元素的对象是不允许更改的,比如整型数据、字符串、浮点数等。
x=3这句的执行过程并不是先获取x原来指向的对象的地址,再把内存中的值更改为3,而是新申请一段内存来存储对象3,再让x去指向对象3,所以两次id(x)的值不同。

>>> x=[1,2,3]
>>> id(x)
31470656
>>> x[0]=5
>>> id(x)
31470656
>>> 

在Python中,复杂元素的对象是允许更改的,比如列表、字典、元组等。
对于列表,其id()值返回的是列表第一个子元素x[0]的存储地址。x[0]=5只是让L[0]重新指向了对象5,而x[0]本身的存储地址并没有发生改变,所以id(x)的值没有改变。

总结:

在Python中一切皆对象,变量中存放的是对象的引用。

参考资料:
http://www.cnblogs.com/dolphin0520/archive/2013/03/15/2959602.html