python获取print的输入内容

因为print是输出到sys.out里面, 所以要替换标准的输出:


#coding: utf-8

class TextArea(object):

    def __init__(self):
        self.buffer = []

    def write(self, *args, **kwargs):
        self.buffer.append(args)

import sys

stdout = sys.stdout
sys.stdout = TextArea()

# print to TextArea
print("testA")
print("testB")
print("testC")

text_area, sys.stdout = sys.stdout, stdout

# print to console
print(text_area.buffer)
输出内容:
[('testA',), ('\n',), ('testB',), ('\n',), ('testC',), ('\n',)]

如果是json数据,可以增加一步处理:

data_get_json_ori = text_area.buffer[0]  # json
data_get_json = json.loads(data_get_json_ori)

data_get= {}
host = ''
for key, value in data_get_json.items():
data_get[key] = value

go调用python3

因为python的底层c写的,只需要让go可以调用c就能调用python了

import "github.com/DataDog/go-python3"
/*
#cgo CFLAGS: "-I/usr/include/python3.8"
#cgo LDFLAGS: "-L/usr/local/lib/python3.8" "-lpython3.8"
#define PY_SSIZE_T_CLEAN
#include <Python.h>
*/
pycodeGo := `
from you_get import common
video_url = "` + video_url + `"
res = common.any_download(url=video_url,json_output=True)
output['title'] = res['title']
output['url'] = res['streams']['18']['url']
print(output)
`

defer python3.Py_Finalize()
python3.Py_Initialize()
pyResult := python3.PyRun_SimpleString(pycodeGo)

github上有2个python的项目,一个python2,一个python3

python2:https://github.com/sbinet/go-python

python3:https://github.com/DataDog/go-python3

ubuntu18安装Python3.7

  1. ubuntu18系统自带了python2.7和python3.6;
  2. 不要卸载ubuntu自带的python版本;
  3. ubuntu下不同版本的python可以共存,可直接安装python3.7。

1.升级包索引和软件

sudo apt update
sudo apt upgrade -y

2.安装编译所需包

sudo apt install build-essential zlib1g-dev libbz2-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget

3.下载Python3.7

官网下载Python-3.7.4.tgz文件

wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz

4.解压Python安装包

tar -xzvf Python-3.7.4.tgz

5.编译和安装

cd Python-3.7.4
./configure --prefix=/usr/local/src/python37  # 配置安装位置
sudo make
sudo make install

6.建立软连接

sudo ln -s /usr/local/src/python37/bin/python3.7 /usr/bin/python3.7
sudo ln -s /usr/local/src/python37/bin/pip3.7 /usr/bin/pip3.7

接下来你就可以使用python3.7,而不会影响系统自带的python2.7和python3.6

如果你想用python3.7替换掉系统默认的python3

sudo rm -rf /usr/bin/python3
sudo ln -s /usr/local/src/python37/bin/python3.7 /usr/bin/python3

默认ubuntu系统中没有pip3,直接建立软连接即可。
sudo ln -s /usr/local/src/python37/bin/pip3.7 /usr/bin/pip3

输入python3默认就是你安装好的python3.7了

vim常用配置

set nocompatible " 关闭 vi 兼容模式

syntax on " 自动语法高亮

colorscheme desert" 设定配色方案

set number " 显示行号

set cursorline " 突出显示当前行

set ruler " 打开状态栏标尺

set shiftwidth=4 " 设定 << 和 >> 命令移动时的宽度为 4

set softtabstop=4 " 使得按退格键时可以一次删掉 4 个空格

set tabstop=4 " 设定 tab 长度为 4

set nobackup " 覆盖文件时不备份

set autochdir " 自动切换当前目录为当前文件所在的目录

filetype plugin indent on " 开启插件

set backupcopy=yes " 设置备份时的行为为覆盖

set ignorecase smartcase " 搜索时忽略大小写,但在有一个或以上大写字母时仍保持对大小写敏感

set nowrapscan " 禁止在搜索到文件两端时重新搜索

set incsearch " 输入搜索内容时就显示搜索结果

set hlsearch " 搜索时高亮显示被找到的文本

set noerrorbells " 关闭错误信息响铃

set novisualbell " 关闭使用可视响铃代替呼叫

set t_vb= " 置空错误铃声的终端代码

" set showmatch " 插入括号时,短暂地跳转到匹配的对应括号

" set matchtime=2 " 短暂跳转到匹配括号的时间

set magic " 设置魔术

set hidden " 允许在有未保存的修改时切换缓冲区,此时的修改由 vim 负责保存

set guioptions-=T " 隐藏工具栏

set guioptions-=m " 隐藏菜单栏

set smartindent " 开启新行时使用智能自动缩进

set backspace=indent,eol,start

" 不设定在插入状态无法用退格键和 Delete 键删除回车符

set cmdheight=1 " 设定命令行的行数为 1

set laststatus=2 " 显示状态栏 (默认值为 1, 无法显示状态栏)

set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ %c:%l/%L%)\

" 设置在状态行显示的信息

set foldenable " 开始折叠

set foldmethod=syntax " 设置语法折叠

set foldcolumn=0 " 设置折叠区域的宽度

setlocal foldlevel=1 " 设置折叠层数为

" set foldclose=all " 设置为自动关闭折叠

" 用空格键来开关折叠

" nnoremap @=((foldclosed(line(‘.’)) < 0) ? ‘zc’ : ‘zo’)

" 配置多语言环境

if has("multi_byte")

" UTF-8 编码

set encoding=utf-8

set termencoding=utf-8

set formatoptions+=mM

set fencs=utf-8,gbk
endif

" 选中状态下 Ctrl+c 复制

vmap <C-c>"+y

" 确认vim编辑器是否支持clipboard特性
" vim –version| grep “clipboard"
" 支持这特性的检索结果应该包含 +clipboard,而不支持则会是 -clipboard

更改pip源

  1. 临时使用:

在使用pip的时候加参数-i

例如:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gevent

常用的pip源如下:

pypi 清华大学源:https://pypi.tuna.tsinghua.edu.cn/simple
pypi 豆瓣源 :http://pypi.douban.com/simple/
pypi 腾讯源:http://mirrors.cloud.tencent.com/pypi/simple
pypi 阿里源:https://mirrors.aliyun.com/pypi/

  1. 永久修改:

linux下 :

mkdir ~/.pip
vi ~/.pip/pip.conf
添加内容如下:

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
windows下,直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,新建文件pip.ini,内容如下

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

在crontab中执行scrapy(解决不执行,不爬取数据的问题)

在crontab中执行scrapy会遇到命令不执行,或者执行了但是没有爬取数据的问题,这里做一下总结

  1. 先说这里遇到的问题和解决方案:
    1. spider不执行:在crontab中需要先cd到项目目录,然后调用命令,否则找不到爬虫
    2. 执行scrapy的时候需要调用/usr/local/bin/scrapy crawl spider_name,否则找不到scrapy命令
  2. 如何使用crontab做爬取:这里有2种方式,一种是直接在crontab中执行scrapy crawl spider_name,将每个爬虫写一遍
    1. 0 3 * * * cd /project_path/spider && /usr/bin/python3 startup.py >> /tmp/spider.log
    2. 另一种是增加一个startup.py,调用subprocess,将需要调用的爬虫做整合然后循环调用:
# 顺序执行所有爬虫
import subprocess
from datetime import datetime
import time


def crawl_work():
    date_start = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())

    crawl_name_list = ['spider_1', 'spider_2']
    record_time_list = {}
    for crawl_name in crawl_name_list:
        start_time = time.time()
        record_time_list[crawl_name] = {}
        record_time_list[crawl_name]['start_date'] = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
        subprocess.Popen('/usr/local/bin/scrapy crawl ' + crawl_name, shell=True).wait()
        end_time = time.time()
        record_time_list[crawl_name]['end_date'] = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
        record_time_list[crawl_name]['time_last'] = int((end_time - start_time) / 60)  # 分钟,向下取整
    print('time_record-date_start: ', date_start)
    for crawl_name, record_time in record_time_list.items():
        print('time_record-' + crawl_name + ': ', record_time)
    date_end = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
    print('time_record-date_end: ', date_end)


if __name__ == '__main__':
    crawl_work()

python append 覆盖数据

问题:使用append为list添加object的时候,有时候会出现后面的object将前面的几个给覆盖的情况

原因:当在list中append一个对象的时候,并没有创建新的内存地址,而是将该对象的地址引用了过来,这就导致当该对象变化的时候,前面append进来的对象也会跟着变化。

例子代码:

list = []
item  = {}
for i in range(3,3):
    item[1] = i
    list.append({'item':item})
print(list)


结果:[{'item': {1: 2}}, {'item': {1: 2}}, {'item': {1: 2}}]


解决方式:使用深度拷贝  deepcopy ,复制出一个新的对象并使用。 

例子代码:

import copy

list = []
item  = {}
for i in range(0,3):
    item[1] = i
    list.append(copy.deepcopy({'item':item}))
print(list)

结果:[{'item': {1: 0}}, {'item': {1: 1}}, {'item': {1: 2}}]

vim常用配置

“提示音静音
set noerrorbells
set visualbell

“语法高亮
syntax enable
syntax on

“不生成.swap文件,当buffer被丢弃的时候hide它
setlocal noswapfile
set bufhidden=hide

“设定默认解码
set fenc=utf-8
set fencs=utf-8,usc-bom,euc-jp,gb18030,gbk,gb2312,cp936

“显示行号
set nu

“代码换行时自动缩进
set ai

“设置主题-沙漠色
colorscheme desert

“总是显示状态行 
set laststatus=2 

“设置制表符为4
set tabstop=4 

如果使用了pycharm,phpstorm等IntelliJ IDEA的ideavim插件:新建文件~/.ideavimrc ,在其中增加对应的配置,然后重启编辑器即可