标签 python 下的文章

进入File->settings->Editor->File and Code Templates->Python Script

添加以下内容:

#!/usr/bin/env python
# encoding: utf-8

#set( $SITE = "http://www.phpgao.com" )

"""
@version: ??
@author: phpergao
@license: Apache Licence 
@contact: [email protected]
@site: ${SITE}
@software: ${PRODUCT_NAME}
@file: ${NAME}.py
@time: ${DATE} ${TIME}
"""

def func():
    pass


class Main():
    def __init__(self):
        pass


if __name__ == '__main__':
    pass

脚本中还可以添加自定义变量!

参考链接:

http://wiki.woodpecker.org.cn/moin/CodeCommentingRule http://www.cnblogs.com/ziyouchutuwenwu/archive/2013/12/18/3480035.html https://github.com/phpgao/PyCharm-Python-Templates https://www.jetbrains.com/pycharm/webhelp/creating-and-editing-file-templates.html http://peter-hoffmann.com/2010/python-live-templates-for-pycharm.html

问题

老高最近遇到一个需求,linux\centos下,使用selenium技术抓取数据。本来很简单的问题,但是由于内存限制,安装X window不现实,所以一个BT的想法诞生了,是否可以在centos命令行界面运行一个虚拟的桌面,然后使用selenium控制Firefox浏览器完成一些操作,Firefox运行在虚拟的桌面中,一切操作都在命令行中完成。

Google之,发现了Xvfb,他可以新建一个虚拟的X窗口,再配合python的pyvirtualdisplay,简直就是神器!

安装

centos下:

# 安装Xvfb和pyvirtualdisplay
yum install xorg-x11-server-Xvfb
pip install pyvirtualdisplay

安装firefox和selenium

yum install firefox
pip install selenium

代码

from pyvirtualdisplay import Display
from selenium import webdriver

display = Display(visible=0, size=(800, 600))
display.start()

browser = webdriver.Firefox()
browser.get('http://www.google.com')
print browser.title
browser.quit()

display.stop()

参考网站:

http://selenium-python.readthedocs.org/en/latest/getting-started.html http://nullege.com/codes/search/selenium.webdriver.Remote.find_elements_by_class_name http://www.opsview.com/forum/opsview-core/how-do-i/how-do-i-install-selenium-centos-server https://gist.github.com/textarcana/5855427 http://scraping.pro/use-headless-firefox-scraping-linux/ http://serverfault.com/questions/363827/how-can-i-run-firefox-on-centos-with-no-display https://realpython.com/blog/python/headless-selenium-testing-with-python-and-phantomjs/ https://pypi.python.org/pypi/selenium

http://selenium.googlecode.com/git/docs/api/py/selenium/selenium.selenium.html#module-selenium.selenium

http://www.ibm.com/developerworks/cn/opensource/os-php-designptrns/ http://www.cnblogs.com/fnng/p/3230768.html http://www.cnblogs.com/fnng/p/3157639.html http://www.cnblogs.com/fnng/p/3157639.html

转自: http://openwares.net/linux/python_os_version_platform.html

platform模块提供了底层系统平台的相关信息

系统架构

32位还是64位

>>> import platform
>>> platform.architecture()
('64bit', 'ELF') # python 3.3.2+ 64 bits on debian jessie 64 bits
('32bit', 'WindowsPE') # python 3.3.2 32 bits on windows 8.1 64 bits
('64bit', 'WindowsPE') # python 3.3.2 64 bits on wndows 8.1 64 bits
('64bit', '') # python 3.4.1 64 bits on mac os x 10.9.4
ELF和WindowsPE是可执行文件格式

操作系统

linux,mac还是windows

>>> platform.system()
'Linux' # python 3.3.2+ 64 bits on debian jessie 64 bits
'Windows' # python 3.3.2 32 bits on windows 8.1 64 bits
'Windows' # python 3.3.2 64 bits on windows 8.1 64 bits
'Darwin' # python 3.4.1 64 bits on mac os x 10.9.4

系统版本

>>> platform.version()
'#1 SMP Debian 3.10.11-1 (2013-09-10)' # python 3.3.2+ 64 bits on debian jessie 64 bits
'6.2.9200' # python 3.3.2 32 bits on windows 8.1 64 bits
'6.2.9200' # python 3.3.2 64 bits on windows 8.1 64 bits
'Darwin Kernel Version 13.3.0: Tue Jun  3 21:27:35 PDT 2014; root:xnu-2422.110.17~1/RELEASE_X86_64' # python 3.4.1 64 bits on mac os x 10.9.4

CPU平台

>>> platform.machine()
'x86_64' # python 3.3.2+ 64 bits on debian jessie 64 bits
'AMD64' # python 3.3.2 32 bits on windows 8.1 64 bits
'AMD64' # python 3.3.2 64 bits on windows 8.1 64 bits
'x86_64' # python 3.4.1 64 bits on mac os x 10.9.4

linux发行版

>>> platform.dist()
('debian', 'jessie/sid', '') # python 3.3.2+ 64 bits on debian jessie 64 bits

节点名

也就是机器名

>>> platform.node()
'work' # python 3.3.2+ 64 bits on debian jessie 64 bits
'work-xxx' # python 3.3.2 32 bits on windows 8.1 64 bits

系统信息

>>> platform.uname()
uname_result(system='Linux', node='work', release='3.10-3-amd64', version='#1 SMP Debian 3.10.11-1 (2013-09-10)', machine='x86_64', processor='') # python 3.3.2+ 64 bits on debian jessie 64 bits
 
uname_result(system='Windows', node='work-xxx', release='8', version='6.2.9200', machine='AMD64', processor='Intel64 Family 6 Model 58 Stepping 9,
GenuineIntel') # python 3.3.2 32 bits on windows 8.1 64 bits
 
uname_result(system='Darwin', node='mba', release='13.3.0', version='Darwin Kernel Version 13.3.0: Tue Jun  3 21:27:35 PDT 2014; root:xnu-2422.110.17~1/RELEASE_X86_64', machine='x86_64', processor='i386') # python 3.4.1 64 bits on mac os x 10.9.4

python版本

>>> platform.python_verison()
'3.3.2+' # python 3.3.2+ 64 bits on debian jessie 64 bits
'3.3.3' # python 3.3.2 32 bits on windows 8.1 64 bits

python中浅拷贝和深拷贝

今天写python脚本,遇到了一个问题。先贴代码:

#coding=utf-8
new_list = []               # 声明一个list
tmp = {'a':123,'b':'ccc'}   # 新建一个dict
new_list.append(tmp)        # 追加
print tmp
print new_list
tmp['a'] = 456              # 修改tmp
tmp['b'] = 'ddd'
new_list.append(tmp)        # 追加
print tmp
print new_list

# 执行结果:

{'a': 123, 'b': 'ccc'}
[{'a': 123, 'b': 'ccc'}]    # 当改变了tmp,list中的值也会变化
{'a': 456, 'b': 'ddd'}
[{'a': 456, 'b': 'ddd'}, {'a': 456, 'b': 'ddd'}]

如果是PHP会发生什么?

$b = array();
$a = array('b'=>123);
array_push($b , $a);
$a = array('b'=>456);
array_push($b , $a);
var_dump($b);

$a = new ArrayObject(array('b'=>123));
$arr = new ArrayObject();
$arr->append($a);
$a['b'] = 456;
$arr->append($a);
var_dump($arr);

# 执行结果

array(2) {
  [0]=>
  array(1) {
    ["b"]=>
    int(123)
  }
  [1]=>
  array(1) {
    ["b"]=>
    int(456)
  }
}
object(ArrayObject)#2 (1) {
  ["storage":"ArrayObject":private]=>
  array(2) {
    [0]=>
    object(ArrayObject)#1 (1) {
      ["storage":"ArrayObject":private]=>
      array(1) {
        ["b"]=>
        int(456)
      }
    }
    [1]=>
    object(ArrayObject)#1 (1) {
      ["storage":"ArrayObject":private]=>
      array(1) {
        ["b"]=>
        int(456)
      }
    }
  }
}

由结果看,PHP中array_push方法和array_object的结果也不同。

为什么会这样呢?

这里就要讲讲浅拷贝和深拷贝了。

以python为例,当执行new_list.append(tmp)方法时,append方法仅仅把tmp变量的内存地址交给了new_list,而不是新建了一个与tmp一模一样的变量(内存中的地址不同,属性几乎一样),即浅拷贝。这就解释了,当改变了tmp的值后new_list中保存的tmp也会随之改变,因为他们都是一样一样的。

需要注意的是,python中非容器类没有拷贝这一说,还有一些坑在这里可以看到。

引用的能省下不少内存空间,但是会给新手造成迷惑。

PHP中的array_push方法,就会做一次深拷贝,创建了新的变量,所以不论怎么修改传入的$a,都不会影响最终得到两个不同的数组。而使用了数组对象做同样的事,就会出现和python一样的浅拷贝现象。

那么如何解决之前的问题呢?

python的做法是引入标准库中的copy模块。

import copy

copy.copy(x)
# 返回一个x的浅复制。

copy.deepcopy(x)
# 返回一个x的深复制。

exception copy.error
# copy异常

将之前的python代码改为:

#coding=utf-8
import copy
new_list = []               # 声明一个list
tmp = {'a':123,'b':'ccc'}   # 新建一个dict
new_list.append(tmp)        # 追加
print tmp
print new_list
tmp = copy.deepcopy(tmp)
tmp['a'] = 456              # 修改tmp
tmp['b'] = 'ddd'
new_list.append(tmp)        # 追加
print tmp
print new_list

PHP5中对象的赋值和传值都是以“引用”的方式,解决对象深拷贝采用的clone语言结构,有兴趣的TX可以参考php深复制和浅复制

扩展阅读:

http://blog.csdn.net/dizzthxl/article/details/7688744 http://bbs.chinaunix.net/thread-1787290-1-1.html http://www.jb51.net/article/54266.htm http://blog.csdn.net/dizzthxl/article/details/7688744 http://www.cnblogs.com/windlaughing/archive/2013/05/26/3100362.html

源码安装:

点击这里下载源码

解压前线装一下必要的包

    yum install python-devel mysql-devel zlib-devel openssl-devel

解压

    tar xf MySQL-python-1.2.3.tar.gz
    cd MySQL-python-1.2.3

修改mysite.cfg,指定mysql-config的路径

使用whereis mysql-config找路径

    vi mysite.cfg
    #找到mysql_config = XXX
    改为你的路径

继续安装

    python setup.py build
    python setup.py install

工具安装:

sudo easy_install mysql-python

sudo pip install mysql-python

出现错误的解决办法
---

```bash
vi ~/.bash_profile
# add
export DYLD_LIBRARY_PATH='/usr/local/mysql/lib';
PATH="$PATH:/usr/local/mysql/bin"

enjoy~

Win下请直接下载编译好的安装包:

请输入链接描述