1.安装Python虚拟环境
2.python pip 添加清华镜像
3.Ubuntu卸载python后出现系统崩溃以及各种问题的解决方法
4.Python下关于 tkinter 错误的解决方法
5. 字符串前面加u、r、b的含义
6. 中文的unicode编码转换为中文
7.运行python文件,给命令行加参数,指定某几块GPU
8.python中argparse模块介绍
9. import numpy 和 from numpy import * 的区别
10.python进程被kill掉后GPU显存不释放的问题
11.Python中复制与移动的代码
可参考 https://www.cnblogs.com/technologylife/p/6635631.html
Python虚拟环境的主要目的是为了给不同的工程创建互相独立的运行环境。在虚拟环境下,每一个工程都有自己的依赖包,而与其它的工程无关。不同的虚拟环境中同一个包可以有不同的版本。并且,虚拟环境的数量没有限制,我们可以轻松地用virtualenv或者pyenv等工具来创建多个虚拟环境。
pip install virtualenv
选择使用一个Python解释器:
virtualenv -p /usr/bin/python3.5 zhz # -p参数指定Python解释器程序路径,这将会使用 /usr/bin/python3.5 中的Python解释器。
下面这种简单方法不推荐
virtualenv zhz
这条命令会自动创建一个叫“zhz”的目录.
在“zhz”目录下的bin目录下有一个重要的脚本文件activate,这个脚本就是用来将其所在的虚拟环境设置为当前Python的运行环境:
source zhz/bin/activate
在运行完这行命令后,shell的提示符前会出现虚拟环境"zhz"的名字,表示我们已经进入了这个环境中。
这里要注意区分Anaconda里面的命令,anaconda里面进入tensorflow或者pytorch虚拟环境的命令是 source activate zhz
使用 “pip install” 命令安装,例如安装numpy包
pip install numpy
直接使用deactivate命令即可退出虚拟环境
deactivate
这里要注意区分Anaconda里面的命令,anaconda里面退出tensorflow或者pytorch虚拟环境的命令是 source deactivate
要删除一个虚拟环境,只需删除它的文件夹。执行
rm -rf venv
鉴于virtualenv不便于对虚拟环境集中管理,所以推荐直接使用virtualenvwrapper。 virtualenvwrapper提供了一系列命令使得和虚拟环境工作变得便利。它把你所有的虚拟环境都放在一个地方。
虚拟环境的引入解决了我们关于环境冲突的问题,但是它同时也带来了一个问题,就是虚拟环境过多所带来的管理问题。virtualenvwrapper就是专门用来解决虚拟环境管理问题的一个工具。我们可以很方便地用它来实现对虚拟环境的创建,删除,拷贝,并且可以轻松地在不同环境间进行切换。
pip install virtualenvwrapper
使用
which virtualenvwrapper.sh
查找到上一步得到的virtualenvwrapper.sh文件的位置,然后把该路径(设为path)填到下面一步的第二句话。
将 virtualenv 添加进去:将下面两句话复制到 ~/.bashrc中,保存退出。
下面第二句句需要修改路径为上一步的virtualenvwrapper.sh所在路径path/virtualenvwrapper.sh
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh #这一句需要修改路径
执行以下命令
source ~/.bashrc
安装virtualenvwrapper后(即执行完第6步后)就可以使用 workon 命令了。
但是我们会发现使用workon zhz
并不能进入我们在第3步使用virtualenv zhz
创建的环境zhz中去,并且提示我们使用mkvirtualenv zhz
命令创建。
指定python版本,可通过"–python"指定python解释器(使用 whereis python
命令或者which python
可以查看系统中的Python解释器路径)
whereis python
mkvirtualenv --python=/usr/local/python3.5.3/bin/python zhz # 这句话需要更改路径
这样会在WORKON_HOME变量指定的目录下新建名为zhz的虚拟环境,在.virtualenvs/
目录下。
查看该环境下都安装了哪些软件
workon zhz
pip list
pip3 list
会发现他们都在只有这几个包才对
Package Version
------------- -------
pip 19.1.1
pkg-resources 0.0.0
setuptools 41.0.1
wheel 0.33.4
如果接着要安装pytorch,需要先安装numpy之后才会import torch
成功,因为torch依赖numpy
mkvirtualenv zhz
这种不指定python解释器的方法不推荐,因为没有指定python解释器,默认是系统默认的python环境,因此该虚拟环境下有所有python 包,都是之前系统中pip安装的。
使用mkvirtualenv创建虚拟环境之后后,会发现zhz环境创建在/home/zhz/.virtualenvs/
目录下,即创建在.virtualenvs/
目录下。而方法一是把环境’zhz’创建在/home/zhz/
目录下。
deactivate
rmvirtualenv zhz
搜到两篇博客写的:
(1)使用pip 安装python 库时连接国外库时,下载需要很长时间,在配置文件中设置国内镜像可以提高速度。
在linux 下创建 ~/.pip/pip.conf 文件。文件内容如下
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=mirrors.aliyun.com
原文:https://blog.csdn.net/carbon06/article/details/80392248
(2)网上搜到的pip国内镜像大部分是豆瓣的:
http://pypi.douban.com/simple/
但是根本不全,很多包没有,所以推荐清华大学的:
https://pypi.tuna.tsinghua.edu.cn/simple
临时使用
可以在使用pip的时候加参数-i https://pypi.tuna.tsinghua.edu.cn/simple 例如:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gevent
,这样就会从清华这边的镜像去安装gevent库。
永久修改
Linux下,修改 ~/.pip/pip.conf (没有就创建一个), 修改 index-url至tuna,内容如下:
[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
原文:https://blog.csdn.net/kwame211/article/details/85773260
(3)安装tensorflow时,如果使用直接安装速度相对较慢,采取清华大学的镜像会提高速度。
pip3 install tensorflow-gpu -i https://pypi.tuna.tsinghua.edu.cn/simple
由系统自动选择tensorflow-GPU的版本
pip3 install tensorflow-gpu==1.8 -i https://pypi.tuna.tsinghua.edu.cn/simple
人为指定tensorflow版本是1.8,并且是GPU版本
(4) 使用国内镜像下载python库的办法
以下载pandas为例,终端输入命令(前提是python正确安装):
pip install --index https://pypi.mirrors.ustc.edu.cn/simple/ pandas
注:–index后面也可以换成别的镜像,比如http://mirrors.sohu.com/python/
卸载python进入系统后,如果只有一个桌面,解决方法:
1.按ctrl+alt+f1
进入控制台
2.在控制台登录,然后输入
sudo apt-get install ubuntu-minimal ubuntu-standard ubuntu-desktop
3.等待安装结束,重启,问题解决
当Python出现"No module named _tkinter"的情况,解决方法如下(适用于Ubuntu 16.04、18.04):
sudo apt-get install python-tk python3-tk tk-dev
然后安装我想要的Python版本(这一步一定要在上一步的后面才行,否则还是会导入失败):
pyenv install 3.5.6
然后就可以导入tkinter:
import tkinter
不同的系统有不同的用户图形接口,默认的接口在windows下跑是没有问题的,问题是我们很多的webapp都不在windows上跑,一般在linux上面,所以要更改它的默认配置,把模式更改成Agg。
在引入pyplot、pylab之前,要先更改matplotlib的后端模式为”Agg”。直接贴代码:
Import matplotlib
matplotlib.use('Agg') # 添加这一行
import matplotlib.pyplot asplt
如果不能把 matplotlib.use(‘Agg’)这句代码放在正确的位置上,就解决不了错误。
更改配置文件方案:
它的配置文件就是matplotlibrc,在哪里呢?不同系统不一样,系统是ubuntu,运行命令whereis matlotlibrc
,可以找到。找不到也没关系,一般在/etc目录下,按如下方法找:
cd ~
cd /etc
ls
ls后即可以找到matplotlibrc文件。
编辑一下:
sudo vim /etc/matplotlibrc
找到backend这里,然后将其改成Agg.
(1) u/U:表示unicode字符串
不是仅仅是针对中文, 可以针对任何的字符串,代表是对字符串进行unicode编码。
一般英文字符在使用各种编码下, 基本都可以正常解析, 所以一般不带u;但是中文, 必须表明所需编码, 否则一旦编码转换就会出现乱码。
建议所有编码方式采用utf8
(2) r/R:非转义的原始字符串
与普通字符相比,其他相对特殊的字符,其中可能包含转义字符,即那些,反斜杠加上对应字母,表示对应的特殊含义的,比如最常见的”\n”表示换行,”\t”表示Tab等。而如果是以r开头,那么说明后面的字符,都是普通的字符了,即如果是“\n”那么表示一个反斜杠字符,一个字母n,而不是表示换行了。
以r开头的字符,常用于正则表达式,对应着re模块。
(3) b:bytes
python3.x里默认的str是(py2.x里的)unicode, bytes是(py2.x)的str, b”“前缀代表的就是bytes
python2.x里, b前缀没什么具体意义, 只是为了兼容python3.x的这种写法
在爬虫抓取网页信息时常需要将类似"\u4eba\u751f\u82e6\u77ed\uff0cpy\u662f\u5cb8"转换为中文,实际上这是unicode的中文编码。可用以下方法转换:
s = u'\u4eba\u751f\u82e6\u77ed\uff0cpy\u662f\u5cb8'
print(s)
以上代码输出:“人生苦短,py是岸”
s = r'\u4eba\u751f\u82e6\u77ed\uff0cpy\u662f\u5cb8'
s = s.decode('unicode_escape')
print (s)
以上代码在Python2输出:“人生苦短,py是岸”,在Python3会出错:AttributeError: ‘str’ object has no attribute ‘decode’
解决方法:直接去掉decode(‘unicode_escape’)
tips:str通过encode()方法可以编码为指定的bytes。反过来,当从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法。反之,则使用encode()方法即可!
python在bytes和str两种类型转换,所需要的函数依次是encode(),decode()
os.environ["CUDA_VISIBLE_DEVICES"] = '3' # 指定一块GPU
os.environ["CUDA_VISIBLE_DEVICES"] = '3,4' # 指定多块GPU,逗号隔开
os.environ["CUDA_VISIBLE_DEVICES"] = '3' # 指定一块GPU
os.environ["CUDA_VISIBLE_DEVICES"] = '4' # 指定一块GPU
在代码中分开添加下面代码:
parser.add_argument('--gpus', default=0, type=str, help='assign gpus')
os.environ["CUDA_VISIBLE_DEVICES"] = opt.gpus
值得说明的是opt.gpus的这个gpu就是取自’–gpus’,没有指定dest所以默认去掉了横杠。有疑问可参考下面一节argparse模块的介绍。
摘自:https://blog.csdn.net/weixin_33720452/article/details/88280651
argparse模块是Python中最重要的模块之一,其用于命令行参数解析。此模块的内容非常复杂,本文只选取其中较为实用的部分进行讨论。
使用argparse主要分为三个部分:
parser = argparse.ArgumentParser()
add_argument函数的主要参数如下:
第一、二位置参数:用于设定一个参数的单横线或双横线参数名,或同时设定这二者。注意,单横线参数名只能使用单个字母,多于一个字母的参数名则必须使用双横线。
action:主要用于将普通参数修改为开关参数。当此参数被设定为字符串store_true时,当前命令行参数变为无需参数的开关参数,如果给出此命令行参数,则参数值解析为True,如果不给出,则解析为False。反之,如果action设定为字符串store_false,则开关参数给出时,参数被解析为False,不给出时,才解析为True。
nargs:默认情况下,一个命令行参数只能接一个后续参数值,而如果将nargs设定为字符串星号或加号时,当前参数将自动被解析为列表,且可以在一个命令行参数后给出多个值。星号与加号的区别类似于正则表达式:星号代表能够接受0到任意数量的参数,而加号则表示参数至少需要给出一个。此参数也可给定为一个具体的整数,则参数数量必须严格等于该值。
default:用于设定默认值。当没有为这个命令行参数给出值时,就使用此默认值。
type:给定为一个函数,默认为str。一般可给定为int或float,可将字符串形式的参数通过指定的函数转换为其他类型。
required:默认为False,此时当不给出这个参数时,命令行参数就将被解析为None。而如果指定为True,则该命令行参数必须给出,否则程序将报错。
help:指定为一个帮助字符串。这个字符串将显示在调用-h命令时。
dest:指定为一个变量名,用于后续的parse_args函数。
此函数返回一个对象,对此对象进行属性访问即可获取到各个命令行参数。而属性的名称遵循以下规则:如果某个参数定义了 dest 参数,则使用这个参数作为属性名,如果没有,则使用 去掉横线 的位置参数名作为属性名,如-i参数就对应于i属性。
以下通过一个完整的函数说明上文的各种用法:
import argparse
def _inputArguments():
parser = argparse.ArgumentParser() # 第一部分
# 第二部分
parser.add_argument('-a', '--aa', help = 'Argument: A')
parser.add_argument('-b', dest = 'bbb', required = True, nargs = '*', help = 'Argument: B')
parser.add_argument('-c', action = 'store_true', help = 'Argument: C')
parser.add_argument('-d', type = int, default = 1, help = 'Argument: D')
args = parser.parse_args() # 第三部分
return args.aa, args.bbb, args.c, args.d
print(_inputArguments())
首先,argparse将自动定义-h与—help参数,用于生成帮助信息。
而上述代码定义了四个参数,A参数为较普通的参数,通过-a或—aa进行给定。
B参数为一个必须给出的不定长参数,给出的各个参数之间以空格隔开即可,如:-b 1 2 3,则此参数就将被解析为:[‘1’, ‘2’, ‘3’]。如果不给出b参数,程序将报错,且由于设定了 dest参数,故解析时此参数应使用dest参数所给出的属性名,本例为bbb,而不是b。
C参数为一个开关参数,如果给出-c,则解析出的args.c为True,否则为False。
D参数为一个类型为整形的参数,默认值为1,如果给出D参数,则参数将自动套用int函数转为整数,否则如果不给出此参数,则默认为1。
import numpy
用numpy的属性时,需要这么使用numpy.func()
;
from numpy import *
用numpy属性时,不需要加上numpy.
;
以调用numpy中的random模块为例,第一种方式要用numpy.random
,第二种方式直接用random
即可。
但是请特别注意:pep标准推荐使用第一种方式,请在日常使用中尽量使用第一种方法,就比如numpy中random,标准库中也有random,但是两者的功能是不同的,使用第二种方式容易造成混淆。
所以一般只在自己定义的python包中使用from ? import *
这种方式,自己定义的函数不要与标准库中的函数名相同即可。
注意自己写Python包或者模块的时候需要在文件夹下创建一个__init__.py 的空文件,否则会导入包失败。
kill掉服务器里两个python进程,结果发现GPU的显存并没有被释放,使用top或者ps -A命令也查看不到是那些进程。
解决方法:
1 重新开一个shell,然后输入:ps aux|grep user_name|grep python
,(注意:这里需要把user_name
替换成自己电脑的用户名),所有该用户下的python程序就会显示出来(很多在用watch命令都不会显示的进程在这里可以看到);
2 然后再一个个用kill命令清理:
kill -9 pid # 或者下面的命令
kill-s 9 pid
import shutil
shutil.copy('/home/zhz/a.txt', dst_path) # 把a.txt文件复制到dst-path路径下
shutil.move('/home/zhz/a.txt', dst_path) # 把a.txt文件移动到dst-path路径下
shutil.copyfile(filename, dst_path + 'b.txt') # 把filename文件复制到dst_path路径下,并改名为b.txt