显示标签为“Python”的博文。显示所有博文
显示标签为“Python”的博文。显示所有博文

2020年4月28日星期二

python datetime计算时间差

from datetime import datetime
begin = datetime.strptime('00:01:00.000', '%H:%M:%S.%f')
end = datetime.strptime('00:01:00.002', '%H:%M:%S.%f')
duration = begin - end
duration.total_seconds()  // duration.seconds只计算秒的部分,duration.microseconds只计算毫秒的部分。计算时间差使用total_seconds

2020年2月19日星期三

Python PIP Install throws TypeError: unsupported operand type(s) for -=: 'Retry' and 'int'

参考 https://stackoverflow.com/questions/37495375/python-pip-install-throws-typeerror-unsupported-operand-types-for-retry/46970344#46970344

apt-get remove python-pip python3-pip
wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py
python3 get-pip.py

如果运行get-pip.py很慢,修改文件中的args = ["install", "--upgrade", "--force-reinstall", "-i", "https://pypi.douban.com/simple"] + args,新增了pip源即可。

2019年11月27日星期三

pip install openpyxl问题解决

使用python2安装openpyxl时一直遇到一个问题:
Collecting openpyxl
  Using cached https://files.pythonhosted.org/packages/f4/5f/fb8706fba43b46716e252fdd3ffdfe801a63a0f4663b80b6f3421d85ab70/openpyxl-3.0.2.tar.gz
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-build-qUECOe/openpyxl/setup.py", line 28, in <module>
        from importlib.util import module_from_spec, spec_from_file_location
    ImportError: No module named util

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-qUECOe/openpyxl/

发现装3.x版本都不行,pip install pip install openpyxl==2.6.4,换成旧版本之后,解决问题。

2019年11月20日星期三

SSL connection error: SSL_CTX_set_tmp_dh failed错误

使用conda list查看到openssl的版本是1.1.1d,将openssl降级,问题解决:
conda install openssl=1.0.2r
参考https://github.com/ContinuumIO/anaconda-issues/issues/10646

conda install遇到PackagesNotFoundError

conda install pydub,无法安装,PackagesNotFoundError: The following packages are not available from current channels

解决:conda install -c conda-forge pydub

2019年11月1日星期五

python2 flask get argument处理url编码

import urllib
urllib.unquote(arg.encode('utf-8'))

python2 flask返回结果编码问题

f.jsonify默认是unicode编码,不会出现什么问题,如果想返回改为utf-8编码的话,需要同时设置:
app.config['JSON_AS_ASCII'] = False
app.config['JSONIFY_MIMETYPE'] = 'application/json;charset=utf-8'

不仅需要设置了JSON_AS_ASCII,返回的头也要设置成utf-8。

2018年7月19日星期四

homebrew 安装不同版本的 python

安装
brew update
brew install pyenv

配置
在 .zshrc 或 .bash_profile 文件最后写入:
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
if which pyenv > /dev/null;
  then eval "$(pyenv init -)";
fi

查看可安装的版本
pyenv install --list

安装python版本
pyenv install 3.6.3

查看当前已安装的python版本
pyenv versions

设置python版本
# 对所有的Shell全局有效,会把版本号写入到~/.pyenv/version文件中
pyenv global 3.6.3
也可以写成 pyenv global system 3.6.3

# 只对当前目录有效,会在当前目录创建.python-version文件
pyenv local 3.6.3

# 只在当前会话有效,等同于设置PYENV_VERSION环境变量
pyenv shell 3.6.3

优先级:PYENV_VERSION > local > global

$ pyenv rehash  # 创建垫片路径(为所有已安装的可执行文件创建 shims,如:~/.pyenv/versions/*/bin/*,因此,每当你增删了 Python 版本或带有可执行文件的包(如 pip)以后,都应该执行一次本命令)

重置版本设置
只有 pyenv shell 和 pyenv local 命令有--unset参数
pyenv shell --unset
pyenv local --unset

虚拟环境
个人觉得virtualenv就够了, 用不到pyenv-virtualenv

pyenv-virtualenv 安装
brew update
brew install pyenv-virtualenv

pyenv-virtualenv 配置
在 .zshrc 或 .bash_profile 文件最后写入:
# pyenv-virtualenv
if which pyenv-virtualenv-init > /dev/null;
  then eval "$(pyenv virtualenv-init -)";
fi

创建虚拟环境
$ pyenv virtualenv 2.7.10 env-2.7.10
若不指定python 版本,会默认使用当前环境python版本。环境的真实目录位于 ~/.pyenv/versions 下

列出当前虚拟环境
pyenv virtualenvs
pyenv activate env-name  # 激活虚拟环境
pyenv deactivate #退出虚拟环境,回到系统环境

删除虚拟环境
pyenv uninstall my-virtual-env
rm -rf ~/.pyenv/versions/env-name  # 或者删除其真实目录

问题解决
mac安装有可能会出现 zipimport.ZipImportError: can't decompress data; zlib not available 的问题,解决方法:CFLAGS="-I$(xcrun --show-sdk-path)/usr/include" pyenv install 3.x.x

参考:http://einverne.github.io/post/2017/04/pyenv.html
https://github.com/eteplus/blog/issues/4

2018年6月14日星期四

sqlalchemy 设置 mysql 表的默认字符集

在类中设置 __table_args__ 即可,见下面的代码示例:

from sqlalchemy import Column, Integer, String
class User(BaseModel):
__tablename__='users'
__table_args__={
"mysql_engine":"InnoDB",   # 表的引擎
"mysql_charset":"utf8mb4"   # 表的编码格式
}
id=Column("id",Integer,primary_key=True,autoincrement=True)
name=Column("name",String(50),nullable=False)
age=Column("age",Integer,default=0)

2018年1月25日星期四

python单元测试中使用mock

部分内容转自:https://blog.laisky.com/p/unittest-mock/

Mock
MagicMock是Mock的扩展,允许使用magic methods,参考:https://docs.python.org/3/library/unittest.mock.html#magic-methods
PropertyMock可以mock属性值。

return_value:直接指定mock的返回值
side_effect:可以重写函数
spec:
spec 的适用条件稍微复杂一点,当我们使用 mock 实例的时候,没法指定该实例有哪些方法和属性是可以调用的, mock 会自动的对调用的每一个方法或属性创建返回一个 mock 实例。
但是如果我们希望只对指定的属性或方法使用 mock,就需要 spec 来满足这一需求。
先来看看不使用 spec 的情况:
mock = MagicMock()

dir(mock)
# ['assert_any_call', 'assert_called_once_with', 'assert_called_with', 'assert_has_calls', 'attach_mock', 'call_args', 'call_args_list', 'call_count', 'called', 'configure_mock', 'method_calls', 'mock_add_spec', 'mock_calls', reset_mock', 'return_value', 'side_effect']

# 然后我们调用三个不存在的属性
mock.q
mock.w
mock.e

# 再来看看
# 注意 mock 自动创建增加了 q, w, e 方法
dir(mock)
# ['assert_any_call', 'assert_called_once_with', 'assert_called_with', 'assert_has_calls', 'attach_mock', 'call_args', 'call_args_list', 'call_count', 'called', 'configure_mock', 'e', 'method_calls', 'mock_add_spec', 'mock_calls', 'q', 'reset_mock', 'return_value', 'side_effect', 'w']
我们可以使用 spec 来显示的指定那些方法和属性是可 mock 的。
spec 是一个自定义类,在类里定义可以 mock 的方法和属性:
class SpecClass:

    attr1 = None
    attr2 = None


mock = MagicMock(spec=SpecClass)

print(mock.attr1)
# <MagicMock name='mock.attr1' id='4589618064'>

# 尝试调用未指定的属性时就会抛出 AttributeError
mock.attr3
# Traceback (most recent call last):
#           File "", line 1, in
#           File "/Users/laisky/.pyenv/versions/3.4.1/lib/python3.4/unittest/mock.py", line 568, in __getattr__
#             raise AttributeError("Mock object has no attribute %r" % name)
#         AttributeError: Mock object has no attribute 'attr3'
顺带一提 spec_set,和 spec 不同的一点在于 spec_set 传入的是一个实例而不是对象:
mock = MagicMock(spec=SpecClass)

# 等效于
mock = MagicMock(spec_set=SpecClass())
如果你只是简单希望只能调用显式 mock 过的方法和属性,又懒得去重复写一遍 spec,可以直接指定 spec=True。

Patch
patch 用来将指定(target)的实例替换为 mock 实例,主要用法有三种:
作为 decorator 修饰函数或类
作为 context 上下文管理器
作为 patch object,通过 start 和 stop 来管理 mock

1. @patch 装饰器
2. with patch() 作为上下文
3. patch.start()、patch.stop() 手动开启和关闭

2017年12月12日星期二

ubuntu安装python3.6

ubuntu14.04/16.04安装python3.6:
http://ubuntuhandbook.org/index.php/2017/07/install-python-3-6-1-in-ubuntu-16-04-lts/

sudo add-apt-repository ppa:jonathonf/python-3.6
sudo apt-get update
sudo apt-get install python3.6

sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5 1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 2
sudo update-alternatives --config python3

2017年10月13日星期五

intellij添加python包

File -> Project Sturcture... 中先看下左侧的Modules中有没有添加Python的module,没有则先添加python module。

然后再点左侧的Global Libraries,添加需要的python source包目录即可。

例如,我进行pyspark开发,将spark-2.2.0-bin-hadoop2.7/python添加到source中,这样项目中就可以跳转到pyspark的代码并且有代码提示了。

2017年8月9日星期三

pip镜像源的配置

参考http://www.jianshu.com/p/785bb1f4700d

临时使用:
pip install pythonModuleName -i https://pypi.douban.com/simple

修改~/.pip/pip.conf:
[global]
index-url = https://pypi.douban.com/simple

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

2016年10月11日星期二

pycurl使用中的一个问题

curl了很多次url请求,总是随机的出现Pycurl and io.StringIO - pycurl.error: (23, 'Failed writing body)的错误,参考 http://stackoverflow.com/questions/19606447/pycurl-and-io-stringio-pycurl-error-23-failed-writing-body 解决了问题。

2016年10月9日星期日

python中包含utf-8中文的列表或字典输出

直接print会出现以下结果:
>>> print list
['\xe6\x88\x91\xe8', '\xe7\x8b\x97']

使用json.dumps可以输出中文:
import json
print json.dumps(list, encoding="UTF-8", ensure_ascii = False)

使用','.join(list)也可以正确输出中文。

2016年4月19日星期二

Mac中安装pip等

sudo eash_install pip

安装virtualenv:
sudo easy_install virtualenv
创建虚拟环境:
virtualenv venv
source venv/bin/activate
退回全局python解释器:deactivate

安装flask:
sudo pip install flask