分类
python

Ubuntu/Debian/Raspbian源码编译安装Python3.8 及默认版本选择配置

Python 2 即将退出历史舞台,赶紧熟悉python 3的安装及配置吧。

1. 安装编译依赖包

sudo apt update
sudo apt-get install -y build-essential tk-dev libncurses5-dev libncursesw5-dev libreadline6-dev libdb5.3-dev libgdbm-dev libsqlite3-dev libssl-dev libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev libffi-dev tar wget vim

2.下载python3.8源代码

cd /tmp && wget https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tgz
tar -zxf Python-3.8.0.tgz
cd Python-3.8.0

3.编译及安装python3.8

./configure --enable-optimizations
make -j 4 #如果你的系统有8核,可以使用-j 8
make altinstall

不要使用标准make来安装,否则会覆盖系统默认的python版本

by ITGeeker

4.python3.8版本确认

python3.8 --version

5.设置python3.8版本为默认版本

python -V #查看当前默认版本
echo "alias python='/usr/local/bin/python3.8'" >> ~/.bashrc #刚刚编译安装目录
source ~/.bashrc
python -V #确认是否已切换成功

echo “alias python=’/usr/bin/python3.7′” >> ~/.bashrc #切换到python3.7 apt安装版本

by ITGeeker
分类
python 技术奇客

python模块管理 pip临时使用及永久镜像配置

pip安装依赖包速度很慢,此时您可能需要使用国内镜像来加速,特别是配置Home Assistant时,可能就是因为无法获取依赖包而配置失败。

pip临时使用镜像安装python依赖包

可以在使用pip的时候,加上参数-i和镜像地址,如果讨厌安全提示,添加 –trusted-host. 例如临时使用清华镜像安装python模块:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas --trusted-host tuna.tsinghua.edu.cn

pip永久使用镜像安装python依赖包

首先查看当前用户是否有pip配置文件:

cat ~/.pip/pip.conf

Windows的pip配置文件位于:

%HOME%\pip\pip.ini

by ITGeeker

如果没有该文件,手动创建一个

mkdir -p ~/.pip
vi ~/.pip/pip.conf

如果想使用阿里云镜像,请添加:

[global]
index-url = https://mirrors.aliyun.com/pypi/simple
[install]
trusted-host = mirrors.aliyun.com

注意:新版ubuntu要求使用https源

by ITGeeker

如果你有root权限,那么就全局更改吧:

echo -e "
[global]
index-url = https://mirrors.aliyun.com/pypi/simple
[install]
trusted-host = mirrors.aliyun.com
extra-index-url=https://www.piwheels.org/simple">/etc/pip.conf
cat /etc/pip.conf

国内常用pip镜像包括:

  1. 阿里云 http://mirrors.aliyun.com/pypi/simple/
  2. 豆瓣http://pypi.douban.com/simple/
  3. 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
  4. 中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
  5. 华中科技大学http://pypi.hustunique.com/
分类
python

Python处理文件名或路径名中无法decode代码问题

首先讨论的是python 2处理时的问题,其实不是单单指中文名的问题,即使是中文名称,如果能够decode还是没问题的,比如用如下这些方法:

  • – coding: utf-8 –– 或者 –– coding: gbk –
  • 强制utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
  • .decode(‘gbk’).encode(‘utf-8’)
  • unicode(path_name,’utf8′)

当然path前加r, 或者wingdows转用反斜杠,然后用了这四种方法还不行,windows下执行提示windows error 123之类的错误,发现文件名中会有无法decode的符号问号 ?的,基本就是在python 2之下无法解决了。

Windows Error错误参考:

  • WindowsError:[Error 2]        不存在这个文件
  • WindowsError:[Error 3]        没有这个路径
  • WindowsError:[Error 5]        权限问题
  • WindowsError:[Error 13]       该文档被其它程序占用,处理不了  
  • WindowsError:[Error 123]      路径语法有误
  • WindowsError:[Error 145]      目录非空,多在删除非空目录时出现

不要再花时间去解决python 2处理文件名的问题了,基本无法解决的,还是转用python 3吧,ITGeeker技术奇客测试已完美解决,用的是python 3.6的版本,而且是WSL的Ubunt版本测试的。而且现在更新到win10 2019 May的更新版,可以在微软商店直接下载3.7官方版本了,这是催促大家赶紧放弃python 2的节奏。

Python 3.6默认使用utf-8编码,当然你也可以再加上reload在文件首,但和python 2有所不同:

import importlib
import sys
importlib.reload(sys)
分类
python

Python根据年龄计算出生年份

不管通过中文或英文搜索通过年龄来计算出生年份或日期,结果都是教你如何用生日计算年龄的,ITGeeker技术奇客认为应该也有这方面的需求,在此分享自己的代码。

当然反过来计算是无法计算出生日,只能计算出年份,所以不是准确的生日日期。这个代码是在计算出年份后补全月日,把字段存到date格式里,方便日后计算年龄用。

# -*- coding: utf-8 -*-
##############################################################################
#    GeekerMaster奇客大师 www.geekermaster.com
#    Copyright 2019 ITGeeker <alanljj@gmail.com>
##############################################################################
from datetime import datetime, date, timedelta


tday = date.today()
print ('tday: '+str(tday))
#假设年龄40岁
age = 40
birthday_year = tday.year - 40
birthday_mg = str(birthday_year) + '-01-01' #这里的月份和日期是为了补全格式
birthday_full_df = datetime.strptime(birthday_mg, "%Y-%m-%d").date() #格式化为date格式
print ('birthday_full_df: '+str(birthday_full_df))
分类
Odoo python

Odoo timezone时差调整方法

最近在整合VOIP电话(供应商称为云电话)到奇客大师(GeekerMaster)系统,返回的log说是时间戳错误。供应商说每次post的url的时效性是1分钟,检查发现后,我们每次发送Post请求的时候都会重新产生一遍,应该不存在时间过期的问题。

用 _logger.warning记录更多参数,发现在计算post的url时的时间是不对的,比当前电脑时间早了8个小时。而在系统端用date查询时间是正确的。应该是Odoo系统采用UTC时间的问题,Odoo系统前端显示是当前自己时区的时间,后台数据库用的是UTC时间,据说这是解决全球性使用一个系统的时间差问题的最好方法。

但是国内的供应商用的是北京时间UTC+8时区,所以只好着手解决了:

Odoo调整时差方法一

import datetime
from datetime import timedelta

now = (datetime.datetime.now() + timedelta(hours=8)).strftime("%Y%m%d%H%M%S")

直接加8个小时,直观又方便。后面的时间格式根据要求可以更改。

Odoo调整时差方法二

import datetime
import pytz

user_tz = self.env.user.tz
# local_tz = pytz.timezone(user_tz)
now = datetime.datetime.now(pytz.timezone(
            user_tz)).strftime("%Y%m%d%H%M%S")

前提要在个人配置里设置对你自己的时区,否则无法读取。

这里有个小提示: strftime和 strptime是不同的,一个是输出显示时间的样式,后者是输出时间的格式。

ITGeeker技术奇客最近也调试了阿里云的短信,阿里用的时间格式就和时差无关,用的GMT时间。分享一下用python实现阿里短信所需要的时间格式吧:

import time

now = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())

UTC确立以后UTC(GMT)=UTC(+0)作为一般提到的世界时,GMT表示零时区的时刻。 … 格林威治时间(GMT)是一个比较模糊的概念。 在1928年,GMT就是世界时。 在UTC被广泛采用后,我们提到的GMT实际上是UTC时间,或者说零时区的标准时。

所以说用UTC是最好的解决方案。
分类
Odoo python

Python实现人民币大写 金额为负时显示错误时的解决方法

GeekerMaster奇客大师用Odoo开发的一些订单和结算报表都包括金额的人民币大写,采用Num2MoneyFormat的方法,不知道当初是谁分享了这段代码,反正它拯救了很多程序猿的时间。

取自于斯,分享与斯。这里ITGeeker技术奇客也分享一下改写的Odoo人民币大写转换Python代码@api 8(gist@github):

使用此段代码创建一个模块,然后在别的模块调用就可以了,调用代码Sample:

    # compute balance RMB
    @api.one
    @api.depends('balance')
    def compute_balance_cn(self):
        if self.balance:
            self.balance_cn = self.env['geeker.rmb.capital'].Num2MoneyFormat(
                self.balance)

    balance_cn = fields.Char(
        'Renminbi (RMB)', compute=compute_balance_cn, readonly=True, store=True, track_visibility='onchange')

问题: 金额为负时显示大写不正确

当然最好的解决方法是自己修改源代码解决这个问题,但稍显复杂,也不知道是否会引起别的问题,毕竟是抄的别人的代码。如果有大神愿意指点就更好了。

那就抄近路变通方式吧,更改前面的调用代码为:

    # compute balance RMB
    @api.one
    @api.depends('balance')
    def compute_balance_cn(self):
        if self.balance >= 0.00:
            self.balance_cn = self.env['geeker.rmb.capital'].Num2MoneyFormat(
                self.balance)
        else:
            balance_cn_minus = 0 - self.balance
            self.balance_cn = '- ' + self.env['geeker.rmb.capital'].Num2MoneyFormat(
                balance_cn_minus)

    balance_cn = fields.Char(
        'Renminbi (RMB)', compute=compute_balance_cn, readonly=True, track_visibility='onchange')

把负的金额变成正的,然后再计算出来的人民币大写前面加上一个负号“-”,你也可以改成你想要的其他字符,例如“倒欠”等。

分类
Odoo python

Odoo如何获取上个月的第1天和最后一天

GeekerMaster奇客大师有一个SAP自由顾问管理模块,每个月初可以添加上个月的人天数记录,为了减少录入工作量,奇客大师设置了自动获取上个月的工作周期,从月初到月末,代码如下:

import datetime

date_from = fields.Date('Date From', required=True, default=datetime.date(datetime.date.today().year, datetime.date.today().month-1, 1))
date_to = fields.Date('Date To', required=True, default=datetime.date(datetime.date.today().year, datetime.date.today().month, 1)-datetime.timedelta(1))

一直工作正常,结果刚刚进入2019新年,爆出 错误代码:

date_from = fields.Date('Date From', required=True, default=datetime.date(datetime.date.today().year,datetime.date.today().month-1,1))
ValueError: month must be in 1..12

应该是因为现在是1月,如果month-1之后就是0月,系统认为只有1-12个月才存在的缘故吧。使用odoo api进行改造吧:

    @api.multi
    def default_last_month_first_day(self):
        tday = datetime.date.today()
        now_month = tday.month
        if now_month > 1:
            last_month = datetime.date(
                    tday.year, tday.month-1, 1)
        else:
            last_month = datetime.date(
                tday.year, tday.month, 1
            )
        return(last_month)

可以工作,但不完美,也就是如果是1月份,那么date_from获取的是当前月份的第一天,不是上个月的第一天。

引入relativedelta完美解决

import datetime
from dateutil import relativedelta

    @api.multi
    def default_last_month_first_day(self):
        today = datetime.date.today()
        d = today - relativedelta.relativedelta(months=1)
        return datetime.date(d.year, d.month, 1)

    date_from = fields.Date('Date From', required=True, default=default_last_month_first_day, track_visibility='onchange')

分类
python

升级Python到2.7.15 on CentOS 6 x64

Centos 6 自带的2.6版本队友有些情况总会出现各种错误,例如:

File "/usr/lib/python2.6/site-packages/pip/_internal/index.py", line 526 
{str(c.version) for c in all_candidates}, ^ 
SyntaxError: invalid syntax

明确你的Linux版本

cat /etc/redhat-release

安装依赖:

yum groupinstall -y "Development tools"
yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel

下载最新版本并编译安装

cd /tmp
wget https://www.python.org/ftp/python/2.7.15/Python-2.7.15.tgz
tar zxf Python-2.7.15.tgz
cd Python-2.7.15
./configure
make && make install

#新版目录

ll -tr /usr/local/bin/python*

#系统自带老版本目录

ll -tr /usr/bin/python*

备份老版本命令,创建新版本软连接

mv /usr/bin/python /usr/bin/python.old
rm -f /usr/bin/python-config
ln -s /usr/local/bin/python /usr/bin/python && ln -s /usr/local/bin/python-config /usr/bin/python-config && ln -s /usr/local/include/python2.7/ /usr/include/python2.7

检查一下是否正确

python --version

为新版 Python 安装 setuptools

wget https://bootstrap.pypa.io/ez_setup.py -O - | python
easy_install pip

然后就可以pip安装了

pip install itgeeker