分类 Python 下的文章

pipenv安装部署python虚拟环境

为解决python不同版本混用的尴尬,避免污染系统python的依赖包环境, 我们需要创建虚拟环境, 将python2和python3隔离使用,之前使用virtualenv创建,需要将虚拟环境依赖包的导出为requirements.txt, 一旦依赖包变动,就要重新导出,而pipenv会自动帮我们生成Pipfile和Pipfile.lock, Pipfile会随着项目,当我们安装时只需在Pipfile和Pipfile.lock所在的目录下运行pipenv install就可以了,非常方便。
官网地址:https://pipenv.readthedocs.io/en/latest/
pipenv.png

安装pipenv:
方法一: ubuntu用apt安装

sudo apt install software-properties-common python-software-properties
sudo add-apt-repository ppa:pypa/ppa
sudo apt update
sudo apt install pipenv

方法二: windows用pip安装

pip install pipenv



---阅读剩余部分---

安装python3.7出现ModuleNotFoundError: No module named '_ctypes'报错

编译安装Python3.7的时候报错

make install
ModuleNotFoundError: No module named ‘_ctypes’

主要是少安装了包:
解决方法:

yum install libffi-dev -y
yum update -y

然后重新make install即可,如果还报错,在继续安装下其他基础包:

yum install make curl curl-devel gcc gcc-c++ gcc-g77 gcc* make zlib-devel bzip2-devel openssl-devel xz-libs wget unzip xz vixie-cron crontabs ntpdate tar lrzsz sysstat bind-utils vim -y
yum groupinstall 'development tools' -y
yum update -y

Centos7.5测试通过·

参考:
CentOS7.4快速编译安装Python-3.6.3及pip
CentOS6.8安装Python3.5.2最新版及setuptools-20.10.1和pip-8.1.2

Python3.7 Error loading MySQLdb module: No module named 'MySQLdb'

在win10下用Python3.7+Django2.1开发系统,使用MySQL数据库,报错:

Error loading MySQLdb module: No module named 'MySQLdb'。

python 3.0以上版本已经不支持MySQLdb,使用pymysql代替MySQLdb,语法完全兼容,替代步骤:
1、安装pymsql

pip install pymysql

2、打开_init_.py,添加代码:

import pymysql
pymysql.install_as_MySQLdb()

然后运行django即可

python manage.py runserver 0.0.0.0:80

Python中字符串拼接方法整理

ython拼接字符串一般有以下几种方法:

1、直接通过(+)操作符拼接

s = 'Hello'+' '+'World'+'!'
print(s)
输出结果:Hello World!

使用这种方式进行字符串连接的操作效率低下,因为python中使用 + 拼接两个字符串时会生成一个新的字符串,生成新的字符串就需要重新申请内存,当拼接字符串较多时自然会影响效率。

2、通过str.join()方法拼接

strlist=['Hello',' ','World','!']
print(''.join(strlist))
输出结果:Hello World!

这种方式一般常使用在将集合转化为字符串,''.join()其中''可以是空字符,也可以是任意其他字符,当是任意其他字符时,集合中字符串会被该字符隔开,例如:

​strlist=['Hello',' ','World','!']
print(','.join(strlist))
输出结果:Hello, ,World,!

3、通过str.format()方法拼接

s='{} {}!'.format('Hello','World')
print(s)
输出结果:Hello World!
通过这种方式拼接字符串需要注意的是字符串中{}的数量要和format方法参数数量一致,否则会报错。

4、通过(%)操作符拼接

s = '%s %s!' % ('Hello', 'World')
print(s)
输出结果:Hello World!

这种方式与str.format()使用方式基本一致。

5、通过()多行拼接

s = (
    'Hello'
    ' '
    'World'
    '!'
)
print(s)
输出结果:Hello World!

python遇到未闭合的小括号,自动将多行拼接为一行。

6、通过string模块中的Template对象拼接

from string import Template
s = Template('${s1} ${s2}!') 
print(s.safe_substitute(s1='Hello',s2='World')) 
输出结果:Hello World!

Template的实现方式是首先通过Template初始化一个字符串。这些字符串中包含了一个个key。通过调用substitute或safe_subsititute,将key值与方法中传递过来的参数对应上,从而实现在指定的位置导入字符串。这种方式的好处是不需要担心参数不一致引发异常,如:

from string import Template
s = Template('${s1} ${s2} ${s3}!') 
print(s.safe_substitute(s1='Hello',s2='World')) 
输出结果:Hello World ${s3}!

7、通过F-strings拼接

在python3.6.2版本中,PEP 498 提出一种新型字符串格式化机制,被称为“字符串插值”或者更常见的一种称呼是F-strings,F-strings提供了一种明确且方便的方式将python表达式嵌入到字符串中来进行格式化:

s1='Hello'
s2='World'
print(f'{s1} {s2}!')
输出结果:Hello World!

在F-strings中我们也可以执行函数:

def power(x):
    return x*x
x=4
print(f'{x} * {x} = {power(x)}')
输出结果:4 * 4 = 16

而且F-strings的运行速度很快,比%-string和str.format()这两种格式化方法都快得多。

Python中使用sys.argv接收传参

sys.argv是获取运行python文件的时候命令行参数

下面的代码文件是a.py

#encoding=utf-8
import sys
a=sys.argv[0]
b=sys.argv[1]
c=sys.argv[2]
print("filename:",a)
print("param1:",b)
print("param2:",c)

进入文件所在目录,运行python a.py abc 110 输出结果如下

('filename:', 'a.py')
('param1:', 'abc')
('param2:', '110')
sys.argv[0]是文件本身
sys.argv[1]是输入的第一个参数
sys.argv[2]是输入的第二个参数
以此类推

ImportError: No module named pkg_resources解决

这个问题通常是由于升级到python2.7后执行pip产生的,解决方案是重新在python2.7环境中安装pip,步骤如下:

系统:centos7(建议用centos7,6的话需要升级的库太多,glibc也得升级)

第一种安装:

yum install gcc python-setuptools python-devel
easy_install pip

如果不行使用下面步骤:
1.安装distribute

wget https://pypi.python.org/packages/source/d/distribute/distribute-0.7.3.zip --no-check-certificate
unzip distribute-0.7.3.zip
cd distribute-0.7.3
python setup.py install

2.安装setuptool
https://pypi.python.org/pypi/setuptools 下载最新版
解决并进入目录

python setup.py install

3.安装pip

easy_install pip

4.如果安装pip过程中报ImportError: No module named extern异常

https://pypi.python.org/pypi/extern 下载最新extern安装后再次尝试即可

python逐行删除文件

要删除的文件在一个txt文件里面,每行一个地址,直接使用readline然后调用系统命令删除,脚本如下

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import sys
import os
myfile = codecs.open("del.txt","rw","utf-8")
line = myfile.readline()
while line:
    print line,
    line = line.strip('\n\r') #去除每行的换行符
    os.system('rm -rf %s' % (line))  
    line = myfile.readline()
myfile.close()

Python模块之codecs: 自然语言编码转换

当python要做编码转换的时候,会借助于内部的编码,转换过程是这样的:
原有编码 -> 内部编码 -> 目的编码
python的内部是使用unicode来处理的,但是unicode的使用需要考虑的是它的编码格式有两种,一是UCS-2,它一共有65536个码位,另一种是UCS-4,它有2147483648g个码位。对于这两种格式,python都是支持的,这个是在编译时通过--enable-unicode=ucs2或--enable-unicode=ucs4来指定的。那么我们自己默认安装的python有的什么编码怎么来确定呢?有一个办法,就是通过sys.maxunicode的值来判断:

import sys
print sys.maxunicode

如果输出的值为65535,那么就是UCS-2,如果输出是1114111就是UCS-4编码
使用codecs读取中文csv文件:

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import codecs
import sys
print sys.getdefaultencoding()
myfile = codecs.open("test.csv","r","gbk")    #文档是ANSI格式的时候使用gbk,否则直接使用utf-8
line = myfile.readline()
while line:
     print line,
     line = myfile.readline()
myfile.close()

通过Nginx、Uwsgi快速部署Django

uwsgi:是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
运行过程:
nginx作为服务器的最前端,它将接受WEB的所有请求,统一管理请求。nginx把所有静态请求自己来处理(这是nginx的强项,静态文件像我们django博客项目中的static文件夹下面的图片,css,js)。



---阅读剩余部分---

Django关系之ManyToManyField多对多关系及后台调用显示

Django 的 ORM 有多种关系:一对一,多对一,多对多
各自定义的方式为 :
一对一: OneToOneField (一个有一个,即 has one: OneToOneField)
多对一: ForeignKey (多个属于一个,在建立 ForeignKey 时,另一个表会自动建立对应的关系)
多对多: ManyToManyField (一个既有很多个,又属于很多个,即 has many and belong to : ManyToManyField,同样只能在一个model类中说明,关联表会自动建立。)

多对多关系ManyToManyField
现有三张表,cloud表和project表和Host表,cloud有cloud_type信息,project表中有工程名、cloud_type等信息,host表中有host_name、cloud_type信息;






---阅读剩余部分---

Python使用%操作符格式化字符串

%是Python中内置的对字符串进行格式化的操作符,语法如下:

格式符为真实值预留位置,并控制显示的格式。格式符可以包含有一个类型码,用以控制显示的类型,如下:

%s    字符串 (采用str()的显示)

%r    字符串 (采用repr()的显示)

%c    单个字符

%b    二进制整数

%d    十进制整数

%i    十进制整数

%o    八进制整数

%x    十六进制整数

%e    指数 (基底写为e)

%E    指数 (基底写为E)

%f    浮点数

%F    浮点数,与上相同

%g    指数(e)或浮点数 (根据显示长度)

%G    指数(E)或浮点数 (根据显示长度)

%%    字符"%"

---阅读剩余部分---

Python使用readline逐行读取文件内容 去掉换行符"\n"

直接上脚本:

#/usr/bin/env python
# -*- coding: utf-8 -*-
f1 = open("C:\py\code\demo.txt")  #读取的文件路径
print u'文件名是', f1.name
print u'访问模式是', f1.mode
line = f1.readline()
while line:
    print ("----------%s" % (line)),    # 后面跟 ',' 将忽略换行符
    line = f1.readline()
    #line = line.strip('\n')       #也可以直接用strip去除换行符
f1.close()
print '\nok'

CentOS7.4快速编译安装Python-3.6.3及pip

系统版本是CentOS Linux release 7.4.1708 (Core) 迷你版安装的,Python默认版本是2.7.5,升级到python3.6.3的步骤如下:

1、升级安装基础工具包

yum install sqlite-devel sqlite vim wget unzip zip xz xz-devel tar tk tk-devel lrzsz openssl openssl-devel net-tools ntpdate vixie-cron crontabs sysstat bind-utils mysql-devel libffi libffi-devel -y
yum install gcc gcc-c++ gcc-g77 zlib zlib-devel zlib* readline* gcc* make cmake autoconf automake ncurses ncurses-devel bzip2 bzip2-devel gdbm gdbm-devel python-devel -y
yum groupinstall 'development tools' -y
yum install https://centos7.iuscommunity.org/ius-release.rpm
yum update -y

2、下载、编译、安装

wget https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tar.xz
mkdir /usr/local/python3
xz -d Python-3.6.3.tar.xz
tar xvf Python-3.6.3.tar
cd Python-3.6.3
./configure --prefix=/usr/local/python3 --enable-optimizations   
#--prefix 安装目录,--enable-optimizations优化参数(LTO,PGO)性能有10%左右的提升,会增加编译时间

make
make install

3、做软连接、修改yum、libexec的python版本

mv /usr/bin/python /usr/bin/python_bak   #备份
ln -s /usr/local/python3/bin/python3 /usr/bin/python  #软连接

将/usr/bin/yum和/usr/libexec/urlgrabber-ext-down中第一行的 #!/usr/bin/python 改为 #!/usr/bin/python2.7保存即可正常使用yum

4、安装epel-release升级pip

yum install epel-release -y
yum install python-pip -y
pip install -U pip

至此python3.6.3安装完毕。

No module named _sqlite3报错解决

Django执行新建项目时报错
python manage.py startapp blog 报错:

Traceback (most recent call last):  
  File "manage.py", line 10, in <module>  
    execute_from_command_line(sys.argv)  
  File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 353, in execute_from_command_line  
    utility.execute()  
  File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 327, in execute  
    django.setup()  
  File "/usr/local/lib/python2.7/site-packages/django/__init__.py", line 18, in setup  
    apps.populate(settings.INSTALLED_APPS)  
  File "/usr/local/lib/python2.7/site-packages/django/apps/registry.py", line 108, in populate  
    app_config.import_models(all_models)  
  File "/usr/local/lib/python2.7/site-packages/django/apps/config.py", line 202, in import_models  
    self.models_module = import_module(models_module_name)  
  File "/usr/local/lib/python2.7/importlib/__init__.py", line 37, in import_module  
    __import__(name)  
  File "/usr/local/lib/python2.7/site-packages/django/contrib/auth/models.py", line 4, in <module>  
    from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager  
  File "/usr/local/lib/python2.7/site-packages/django/contrib/auth/base_user.py", line 49, in <module>  
    class AbstractBaseUser(models.Model):  
  File "/usr/local/lib/python2.7/site-packages/django/db/models/base.py", line 108, in __new__  
    new_class.add_to_class('_meta', Options(meta, app_label))  
  File "/usr/local/lib/python2.7/site-packages/django/db/models/base.py", line 299, in add_to_class  
    value.contribute_to_class(cls, name)  
  File "/usr/local/lib/python2.7/site-packages/django/db/models/options.py", line 263, in contribute_to_class  
    self.db_table = truncate_name(self.db_table, connection.ops.max_name_length())  
  File "/usr/local/lib/python2.7/site-packages/django/db/__init__.py", line 36, in __getattr__  
    return getattr(connections[DEFAULT_DB_ALIAS], item)  
  File "/usr/local/lib/python2.7/site-packages/django/db/utils.py", line 212, in __getitem__  
    backend = load_backend(db['ENGINE'])  
  File "/usr/local/lib/python2.7/site-packages/django/db/utils.py", line 116, in load_backend  
    return import_module('%s.base' % backend_name)  
  File "/usr/local/lib/python2.7/importlib/__init__.py", line 37, in import_module  
    __import__(name)  
  File "/usr/local/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py", line 39, in <module>  
    raise ImproperlyConfigured("Error loading either pysqlite2 or sqlite3 modules (tried in that order): %s" % exc)  
django.core.exceptions.ImproperlyConfigured: Error loading either pysqlite2 or sqlite3 modules (tried in that order): No module named _sqlite3 

解决办法:安装sqlite-devel

yum install sqlite-devel

重新编译Python3

cd /opt/Python-3.6.2
./configure --prefix=/usr/local --enable-loadable-sqlite-extensions
make
make install

完成以后新建项目,即可;

python manage.py startapp blog

Python2.x和3.x操作MySQL的一点差异

Python2.x下面需要安装MySQLdb

yum install mysql-devel -y
pip install MySQLdb 
pip install MySQL-python  或
pip install C:\tools\MySQL_python-1.2.5-cp27-none-win_amd64.whl

如果是Windows下面需要安装VCForPython27.msi才可以;

Python3.x下面直接安装PyMySQL和mysqlclient就可以了

pip install PyMySQL
pip install mysqlclient

Python解释器的一句话命令

全部是 python -m 形式开头的:

python -m SimpleHTTPServer [port]  #py2可以这么写,当前目录开启一个小的文件服务器, 默认端口8000
另外,python 3中是
python -m http.server [port]
python -m this               # python's Zen
python -m calendar           # 显示一个日历
echo '{"json":"obj"}' | python -mjson.tool  # 漂亮地格式化打印json数据
echo '{"json":"obj"}' | python -mjson.tool | pygmentize -l json # 高亮地打印json格式化
python -m smtpd -n -c DebuggingServer localhost:20025  # mail server
python -m pyftpdlib    #开启当前目录ftp服务

FlaskWTFDeprecationWarning: "flask_wtf.Form" has been renamed to "FlaskForm" and will be removed in 1.0.解决方法

flask_wtf在import的时候如果写成:

from flask_wtf import Form

flask在运行的时候会有警告信息:

FlaskWTFDeprecationWarning: "flask_wtf.Form" has been renamed to "FlaskForm" and will be removed in 1.0...

修改为:

from flask_wtf import FlaskForm

即可正常,相应的class也要从Form改成FlaskForm如:

class LoginForm(FlaskForm):

即可去除FlaskWTFDeprecationWarning: "flask_wtf.Form" has been renamed to "FlaskForm" and will be removed in 1.0警告信息。

最新

分类

归档

评论

  • Liang: 贴下编译参数和步骤,...
  • shao3911: 您好,为什么我在编译...
  • aliang: 先看是yum安装还是...
  • aliang: 将原来的nginx安...
  • yen: 3、如果要回滚的话,...
  • yen: 刚好需要升级ngin...
  • 文雨: 一些新的method...
  • aliang: 默认不屏蔽估计开发团...
  • 山野愚人居: PHP既然允许直接使...
  • aliang: 最下面有github地址·

其它