ubuntu 16.04执行git clone时失败“RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected length was received.”

前几天从github下载代码的时候,一直失败,提示如下:

$ git clone http://github.com/myriadrf/LimeSuite.git
正克隆到 'LimeSuite'...
remote: Counting objects: 13921, done.
error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected length was received.
fatal: The remote end hung up unexpectedly
fatal: 过早的文件结束符(EOF)
fatal: index-pack failed

如果操作系统的语言是英文的话,输出如下内容:

error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected length was received.
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

刚刚开始以为是由于GnuTLSBUG导致的。

当时的解决方法是翻墙出去进行克隆。或者用Windows进行克隆操作。

然而,从最近的新闻来看,更像是遭受了攻击导致的。

继续阅读ubuntu 16.04执行git clone时失败“RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected length was received.”

ubuntu 16.04系统LimeSDR使用srsLTE搭建LTE实验环境

操作系统调整
参考ubuntu 16.04低延迟内核安装低延时内核

CPU调整为最大性能模式,并且不允许降低频率

$ sudo apt-get install cpufrequtils
 
$ sudo touch /etc/default/cpufrequtils
 
$ sudo sed -i "/GOVERNOR.*/d" /etc/default/cpufrequtils
 
$ test -s /etc/default/cpufrequtils && sudo sed -i '$a\GOVERNOR=\"performance\"' /etc/default/cpufrequtils || echo "GOVERNOR=\"performance\"" | sudo tee /etc/default/cpufrequtils
 
$ sudo update-rc.d ondemand disable
 
$ sudo reboot

安装依赖包

$ sudo apt-get install cmake g++ libpython-dev python-numpy swig git libsqlite3-dev libi2c-dev libusb-1.0-0-dev libwxgtk3.0-dev freeglut3-dev

编译安装SoapySDR

$ cd ~ 

$ git clone https://github.com/pothosware/SoapySDR.git

$ cd SoapySDR

$ git pull origin master

$ mkdir build && cd build

$ cmake ..

$ make -j4

$ sudo make install

$ sudo ldconfig

编译安装LimeSDR

$ cd ~

$ git clone https://github.com/myriadrf/LimeSuite.git

$ cd LimeSuite

# 再次更新一下,确保代码到最新
$ git pull

# 不可删除build目录,清理build目录后要还原被误删除的文件,
# 原因在于build目录下存在mcu程序,默认应用启动后从这个目录提取mcu程序刷新到设备

$ mkdir build ; cd build

# cmake -DCMAKE_BUILD_TYPE=Debug ..
$ cmake ..

$ make -j4

$ sudo make install

$ sudo ldconfig

$ cd ../udev-rules/

$ sudo ./install.sh

# Download board firmware
$ sudo LimeUtil --update

编译安装srsGUI

$ cd ~

# srsGUI提供了一个软件示波器的功能,我们可以比较直观的观察到波形信息

$ git clone https://github.com/srsLTE/srsGUI.git

$ cd srsGUI

# 再次更新一下,确保代码到最新
$ git pull

$ mkdir build

$ cd build

$ cmake ..

$ make

$ sudo make install

$ sudo ldconfig

编译安装srsLTE

$ sudo apt-get install git cmake libfftw3-dev libmbedtls-dev libboost-program-options-dev libboost-thread-dev libconfig++-dev libsctp-dev
$ cd ~

$ git clone https://github.com/srsLTE/srsLTE.git

$ cd srsLTE

# 再次更新一下,确保代码到最新
$ git pull

# 目前(2018.05.04)以及之前的代码中srsenb/src/upper/rrc.cc文件中
# uint32_t rrc::generate_sibs() 函数中存在一个数组越界问题,
# 已经提交patch ,具体修改
# 参看https://github.com/srsLTE/srsLTE/pull/173

# 调用LimeSDR设备的代码在 lib/src/phy/rf/rf_soapy_imp.c 文件中
# 这个文件中默认的接收天线是"LNAH",默认的发送天线是"BAND1",需要根据实际情况
# 也就是自己天线接入的接口是哪个,就修改成哪个。
# 调整这里的参数,目前是直接修改代码。比如我这边的发送天线就修改为"BAND2"

$ mkdir build

$ cd build

# cmake -DCMAKE_BUILD_TYPE=Debug ..
$ cmake ../

$ make

$ make test

测试

$ cd ~/srsLTE

$ cd build/lib/examples

#以20M带宽的形式进行基站的扫描,LTE基站带宽20M,目前版本测试不支持,无法扫描到基站
# ./cell_search -b 20

#目前测试仅支持此命令的运行
$ ./pdsch_enodeb

搭建LTE测试环境

$ cd ~/srsLTE

$ mkdir lteCell

$ cd lteCell


# 生成配置文件
$ mkdir lteENB

$ cp ../srsenb/enb.conf.example lteENB/enb.conf

$ cp ../srsenb/rr.conf.example lteENB/rr.conf

$ cp ../srsenb/sib.conf.example lteENB/sib.conf

$ cp ../srsenb/drb.conf.example lteENB/drb.conf

$ mkdir lteEPC

$ cp ../srsepc/epc.conf.example lteEPC/epc.conf

$ cp ../srsepc/user_db.csv.example lteEPC/user_db.csv


# 生成运行脚本
$ echo "echo -ne \"\033]0;ENB\007\"" >> run_enb.sh

$ echo "cd lteENB" >> run_enb.sh


# 需要gdb的话使用如下
#echo "#gdb -args ../../build/srsenb/src/srsenb enb.conf" >> run_enb.sh

$ echo "../../build/srsenb/src/srsenb enb.conf" >> run_enb.sh

$ echo "echo -ne \"\033]0;EPC\007\"" >> run_epc.sh

$ echo "cd lteEPC" >> run_epc.sh

# 需要配置如下转发规则,否则不能正常工作,配置信息参考openair-cn的SPGW中的代码
# sudo sysctl -w net.ipv4.ip_forward=1
# sudo sync
# sudo iptables -t mangle -F FORWARD
# sudo iptables -t nat -F POSTROUTING
# export LANG=C
# 如果没有修改过配置文件,则默认使用如下配置即可,
# 如果修改过sgi_if_addr的地址(默认sgi_if_addr=172.16.0.1),需要更改这个字段
# export FORDING_IPs=172.16.0.0/12
# 有线网卡一般以"en"开头,比如"enp3s0",此处需要根据自身机器上的网卡进行设置,修改
# export NIC_NAME=`ls /sys/class/net | grep en`
# export NIC_IP=`ifconfig $NIC_NAME | grep 'inet addr:' | awk '{print $2}' | cut -c 6-`
# sudo iptables -t nat -I POSTROUTING -s $FORDING_IPs -o  $NIC_NAME ! --protocol sctp -j SNAT --to-source $NIC_IP

$ echo "sysctl -w net.ipv4.ip_forward=1" >> run_epc.sh

$ echo "sync" >> run_epc.sh

$ echo "iptables -t mangle -F FORWARD" >> run_epc.sh

$ echo "iptables -t nat -F POSTROUTING" >> run_epc.sh

$ echo "export LANG=C" >> run_epc.sh

$ echo 'export FORDING_IPs=172.16.0.0/12' >> run_epc.sh

$ echo 'export NIC_NAME=`ls /sys/class/net | grep en`' >> run_epc.sh

$ echo "export NIC_IP=\\`ifconfig \$NIC_NAME | grep 'inet addr:' | awk '{print \$2}' | cut -c 6-\\`" >> run_epc.sh

$ echo 'iptables -t nat -I POSTROUTING -s $FORDING_IPs -o  $NIC_NAME ! --protocol sctp -j SNAT --to-source $NIC_IP' >> run_epc.sh

$ echo "../../build/srsepc/src/srsepc epc.conf" >> run_epc.sh

$ echo "gnome-terminal -e \"bash run_epc.sh\"" >> run.sh

$ echo "sleep 2" >> run.sh

$ echo "gnome-terminal -e \"bash run_enb.sh\"" >> run.sh


# 运行测试
$ sudo bash run.sh

#日志查看 /tmp/enb.log, /tmp/epc.log

如果设备(比如手机)的设置是按照ubuntu 16.04系统LimeSDR V1.4使用OpenAirInterface搭建LTE实验环境里面的设置的,设备参数如下图:
注意上图与OpenAirInterface中设置的不同之处,差别就是一个选中OPC,一个选中OP

则需要对配置文件进行如下调整:

$ cd ~/srsLTE/lteCell

# 修改MNC,MCC
$ sed -i -r "s/^mnc[ \t]*=[ \t0-9]*/mnc = 92/g" lteENB/enb.conf
$ sed -i -r "s/^mcc[ \t]*=[ \t0-9]*/mcc = 208/g" lteENB/enb.conf
$ sed -i -r "s/^tac[ \t]*=[ \t]*0x[0-9]*/tac = 0x0001/g" lteENB/enb.conf

$ sed -i -r "s/^mnc[ \t]*=[ \t0-9]*/mnc = 92/g" lteEPC/epc.conf 
$ sed -i -r "s/^mcc[ \t]*=[ \t0-9]*/mcc = 208/g" lteEPC/epc.conf
$ sed -i -r "s/^tac[ \t]*=[ \t]*0x[0-9]*/tac = 0x0001/g" lteEPC/epc.conf

# 修改认证加密算法
$ sed -i -r "s/^auth_algo[ \t]*=[ \ta-Z]*/auth_algo = milenage/g" lteEPC/epc.conf


# 需要软件示波器界面的话,修改 lteEPC/epc.conf 里面的 [gui]部分的enable = true
# 但是打开示波器会导致CPU开销加大,降低实时性,稳定性变低

# 认证数据库中增加Name,IMSI,Key,OP,AMF,SQN 这里主要的就是IMSI,Key,OP这几个参数
# OPc=AES128(Ki,OP) XOR OP 因此需要反算 OP 
# openair-cn需要OPc,而 srsLTE 的epc需要 OP 这是两者的主要区别
# OPc = 504f20634f6320504f50206363500a4f 
# Ki = 6874736969202073796d4b2079650a73
# OP = 11111111111111111111111111111111
# 最后的 SQN 目前测试发现如果一直不能正常注册,并且提示
# "Sequence number synch failure" 则会观察到,当EPC退出时候,应用一定回写 
# 成000000001b02 ,一旦出现这个数字,我们就没办法注册设备了。应该是个BUG
# http://www.mobibrw.com/?p=12688 中我们持续跟进这个问题,目前猜测是要比设备最后
# 一次通信记录的数据号大就可以了,如果要复位可以让设备关机,应该就从0开始了。
 
$ sed -i '$a\ue3,208920100001100,6874736969202073796d4b2079650a73,11111111111111111111111111111111,8000,000000001b03' lteEPC/user_db.csv

注意目前srsLTE的CPU开销远远高于OpenAirInterface,差不多一个内核满负载,以及稳定性是低于OpenAirInterface的,经常出现连接困难以及中途掉线,这部分需要后续的持续修改。目前测试发现,在"lteEPC/epc.conf"中关闭GUI的显示,可以显著减低CPU开销,并增加稳定性,但是还是比OpenAirInterface要多消耗CPU。另外在"lteEPC/epc.conf"中日志设置成"all_level = none"也可以降低CPU开销,并且增加稳定性。

另外,注意"/tmp/enb.log",这个日志文件默认情况下,写入的比较多,文件大小增长很快,注意磁盘占用情况。

目前测试发现,使用Intel MKL加速的情况下,CPU降低并不明显,而稳定性下降非常多应该是代码的适配问题。因此,暂时不要使用Intel MKL。

目前测试发现,使用最新的FFTW3版本,使用AVX,AVX2加速的情况下,CPU开销更高,性能更差,应该是代码存在BUG。因此,暂时不要使用自己编译的FFTW3,使用系统自带的版本即可。

手机等设备的设置参考ubuntu 16.04系统LimeSDR V1.4使用OpenAirInterface搭建LTE实验环境最后的介绍。

上述的代码如果下载困难,可以从本站下载一份拷贝。

SoapySDR源代码下载
LimeSuite源代码下载
srsLTE源代码下载
srsGUI源代码下载
fftw3源代码下载

参考链接


ubuntu 16.04低延迟内核

在某些特殊环境中,比如音视频实时处理(比如MIDI),无线电数据的编解码(比如 OpenAirInterface 明确要求使用低延时内核)等情况下,我们希望系统尽可能的实时,同时又不会降低太多的性能(实时性越高,性能,功耗等的损失越大)。这种情况下,我们可以尝试使用低延时内核。

Linux提供了五种内核类型,对于内核类型的选择,可以参考如下的解释:

*******************************************

  • If you do not require low latency for your system then please use the -generic kernel.
  • If you need a low latency system (e.g. for recording audio) then please use the -preempt kernel as a fist choice. This reduces latency but doesn't sacrifice power saving features. It is available only for 64 bit systems (also called amd64).
  • If the -preempt kernel does not provide enough low latency for your needs (or you have an 32 bit system) then you should try the -lowlatency kernel.
  • If the -lowlatency kernel isn't enough then you should try the -rt kernel
  • If the -rt kernel isn't enough stable for you then you should try the -realtime kernel

*******************************************

目前(2018.02)为止,ubuntu官方库中提供前四种内核,我们一般建议使用lowlatency版本。可以使用如下命令安装:

$ sudo apt-get install linux-lowlatency

$ sudo apt-get install linux-image-`uname -r | cut -d- -f1-2`-lowlatency

$ sudo apt-get install linux-headers-`uname -r | cut -d- -f1-2`-lowlatency

# 重启加载新内核
$ sudo reboot

目前,如果机器上使用了nvidia显卡,并且使用nvidia的闭源驱动的情况下,重启机器会无法进入图形界面,查看系统日志,出现如下错误信息:

$ cat /var/log/syslog | grep dkms
Feb 28 16:23:01 xx-System-Product-Name gpu-manager[831]: Error: can't open /lib/modules/4.13.0-36-lowlatency/updates/dkms

解决方法如下:

#目前最新版本驱动是384版本,如果使用的其他版本,请配置使用的版本

$ sudo dpkg-reconfigure nvidia-384

注意,使用sudo apt-get dist-upgrade升级内核的时候,内核会被替换成generic版本,低延时内核需要手工重新安装一遍。

参考链接


ubuntu 16.04修复固件刷新失败的LimeSDR-USB V1.4

最近在使用LimeSDR捣鼓软件定义无线电,结果在刷新固件的过程中,莫名失败,导致无法识别硬件。

使用LimeUtil检查硬件,出现如下结果:

$ sudo ./LimeUtil --find
  * [WestBridge , media=USB 2.0, module=STREAM, addr=04b4:00f3, serial=0000000004BE]

之后就再也无法通过

$ sudo ./LimeUtil --update

更新固件了,一直失败。

继续阅读ubuntu 16.04修复固件刷新失败的LimeSDR-USB V1.4

ubuntu 16.04上调整使用Innodb存储引擎的MySQL性能

最近WordPress上使用的WP Statistics打开的时候,整个网站都几乎处于卡顿的状态,无法正常访问。

使用top命令发现主要是mysqldCPU占用很高。于是使用mytop分析当前执行的查询语句,发现主要是在查询wp_statistics_visitor表导致的问题(我设置了不要删除浏览记录,因此会导致表内数据偏多)。

大致估计是由于分配给MySQL的内存不足导致频繁的磁盘交换引起的性能问题。

解决方法比较简单,就是增大MySQL可以使用的内存即可。

首先确认服务器上的MySQL使用的存储引擎是否为Innodb(缺省情况下已经是Innodb了):

$ mysql -p -e "show variables like '%storage_engine%';"

如果确定是Innodb,则查询Innodb被限制使用的内存大小,如下:

$ mysql -p -e "SELECT @@innodb_buffer_pool_size;"

默认情况下是128MB,鉴于内存已经不够了,我们扩大到256MB,这部分内存原则上越大越好,越大与磁盘的交互越少,性能越高。

如下命令调整Innodb的内存:

$ sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld]部分增加(如果存在则修改):

innodb_buffer_pool_size = 256M

然后重启MySQL服务:

$ sudo service mysql restart

上面的调整之后,性能提升还是比较明显的。

参考链接


ubuntu 16.04.3上apache2服务器报告错误“script not found or unable to stat: /usr/lib/cgi-bin/php*”

最近在查看服务器上的apache2的错误日志的时候,发现如下错误信息:

[Sun Jan 28 19:06:13.794012 2018] [cgi:error] [pid 3382:tid 139940209870592] [client 149.56.130.214:39    474] AH02811: script not found or unable to stat: /usr/lib/cgi-bin/php
[Sun Jan 28 19:06:14.238284 2018] [cgi:error] [pid 3382:tid 139940117550848] [client 149.56.130.214:39    474] AH02811: script not found or unable to stat: /usr/lib/cgi-bin/php5
[Sun Jan 28 19:06:15.550249 2018] [cgi:error] [pid 3382:tid 139940226656000] [client 149.56.130.214:39    474] AH02811: script not found or unable to stat: /usr/lib/cgi-bin/php-cgi
[Sun Jan 28 19:06:15.983952 2018] [cgi:error] [pid 3382:tid 139940125943552] [client 149.56.130.214:39    474] AH02811: script not found or unable to stat: /usr/lib/cgi-bin/php.cgi
[Sun Jan 28 19:06:16.422075 2018] [cgi:error] [pid 3382:tid 139940033623808] [client 149.56.130.214:39    474] AH02811: script not found or unable to stat: /usr/lib/cgi-bin/php4

刚刚开始感觉莫名其妙,因为PHP的解析已经通过PHP-FPM模式进行处理,服务器上的配置已经不需要cgi进行处理了。

网上搜索了一下,发现这个是由于ubuntuapache2的默认配置模版导致的,尤其是从ubuntu 12.04一路升级上来的系统,在配置模版中有指出/usr/lib/cgi-bin/这个路径,可是这个路径已经不再使用了。

修改方式如下:

$ sudo vim /etc/apache2/sites-enabled/000-default.conf

向下查找,会发现如下内容:

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin/">
	AllowOverride None
	Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
	Order allow,deny
	Allow from all
</Directory>

如果确实网站已经不再使用任何cgi相关的东西了,可以直接注释掉这段代码。
另外如果开启了HTTPS,同理需要修改HTTPS对应的配置文件。

修改完成后,重启服务器:

$ sudo service apache2 restart

参考链接


script not found or unable to stat: /usr/lib/cgi-bin/php-cgi

Ubuntu 17.10将于1月11日“重新”发布,修复“变砖”问题

Ubuntu 17.10将于111日“重新”发布,表示不会再让本本变砖~

Canonical上个月从Ubuntu的官方网站临时关闭了Ubuntu 17.10的下载通道,并留下通知:

由于在 某些笔记本电脑(主要为联想)上出现BIOS固件问题,导致笔记本电脑无法启动,目前不推荐下载Ubuntu 17.10。待问题解决后,再重新开放。

继续阅读Ubuntu 17.10将于1月11日“重新”发布,修复“变砖”问题

Ubuntu 14.04.5安装开源跳板机 Jumpserver 开发版(2018.01.08)

参照ubuntu 14.04.5下安装多版本Python(2.7.6/3.4.3/3.6.4),安装配置最新版本的Python 3.6.4Jumpserver需要Python 3.5以上的版本才能正常运行。

目前我们安装的是2018.01.08的开发版Jumpserver,此时的版本信息如下:

commit dfaf029a68f3e3a327a0f22c470306e9bf64aedb
Author: ibuler <ibuler@qq.com>
Date: Mon Jan 8 15:51:08 2018 +0800

[Bugfix] 资产导入bugfix

安装流程:

$ sudo apt-get update
$ sudo apt-get upgrade

$ pip3 install --upgrade pip

# c/_cffi_backend.c:15:17: fatal error: ffi.h: 没有那个文件或目录
$ sudo apt-get install libffi-dev

# Modules/LDAPObject.c:17:18: fatal error: sasl.h: 没有那个文件或目录
$ sudo apt-get install libsasl2-dev

$ sudo apt-get install slapd ldap-utils

# 需要的数据库
$ sudo apt-get install redis-server

$ cd ~

$ git clone https://github.com/jumpserver/jumpserver.git

$ cd ~/jumpserver

$ git checkout dev

# 取消可能影响到我们安装路径的环境变量
$ unset PYTHONPATH

$ cd requirements && sudo apt-get install -y $(cat deb_requirements.txt) && pip3 install -r requirements.txt

$ cd ~/jumpserver

$ cp config_example.py config.py

$ cd apps && python3 manage.py makemigrations && python3 manage.py migrate

$ cd ~/jumpserver

# 安装配置coco,coco被配置用来支持远程登陆
$ git clone https://github.com/jumpserver/coco.git

$ cd coco

$ cd requirements

$ pip3 install -r requirements.txt

$ cd ~/jumpserver/coco 

$ cp conf_example.py conf.py

$ cd ~/jumpserver

$ python3 run_server.py all &

#如果提示 “[service ERROR] Access key is not valid”,则需要执行如下操作
#$ rm -rf coco/keys/.access_key

$ python3 coco/run_server.py

如果代码下载失败,可以从本站下载一份代码拷贝。点击这里下载jumpserver,点击这里下载coco

浏览器通过http://127.0.0.1:8080进行访问,默认的用户名密码都是admin

上面都启动成功之后,通过如下命令访问jumpserver

#$jumpserver_ip为跳板机的访问IP ,$login_user 为跳板机上为登陆用户分配的用户名

$ ssh $jumpserver_ip -p2222 -l $login_user

继续阅读Ubuntu 14.04.5安装开源跳板机 Jumpserver 开发版(2018.01.08)

ubuntu 14.04.5下安装多版本Python(2.7.6/3.4.3/3.6.4)

系统环境:ubuntu14.04.5 LTS,系统默认的python版本为2.7.4/3.4.3

但是实际工作中,某些通过pip安装的开发包需要不低于某个版本的python才能正常工作,比如ansible-2.4.2.0,明确只支持python-3.5以上的版本。在低版本的python上,无法正常运行。

而如果我们贸然更新系统python版本的话,会导致系统异常。因此我们借助pyenv实现基于用户的python版本定制。

安装pyenv

$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc

$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc

$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc

$ exec $SHELL -l

查看可以安装的python版本:

$ pyenv install --list

这里以安装python-3.6.4为例,首先安装依赖:

$ sudo apt-get install -y make build-essential

安装python

# 要求开启Python动态库的支持(默认是全部静态编译),否则在安装某些插件的时候会出现无法正常链接的情况,比如 mod_wsgi
$ export PYTHON_CONFIGURE_OPTS="--enable-shared"

$ pyenv install 3.6.4 -vvv

该命令会从github上下载python的源代码,并解压到/tmp目录下,然后在/tmp中执行编译工作。若依赖包没有安装,则会出现编译错误,需要在安装依赖包之后重新执行该命令。

安装完成之后,需要使用如下命令对数据库进行更新:

$ pyenv rehash

查看当前已经安装的python版本

$ pyenv versions
* system (set by /home/xxx/.pyenv/version)
3.6.4

其中星号代表是当前系统正在使用的python版本是系统自带的。

设置全局的python版本

$ pyenv global 3.6.4

$ pyenv versions
  system
* 3.6.4 (set by /home/xxx/.pyenv/version)

从上面,我们可以看出来当前的python版本已经变为了3.6.4。也可以使用pyenv localpyenv shell临时改变python的版本。

如果需要还原设定的python版本为系统自带的版本,则执行如下命令:

$ pyenv global system

确认python版本

$ python
Python 3.6.4 (default, Jan  9 2018, 11:21:57) 
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.

上面的操作会导致在当前用户下,执行python或者python3命令的时候都会被定向到python-3.6.4,如果只想执行python3命令的时候被定向到python-3.6.4,则可以直接删除python这个链接:

# 注意,这个链接删除后,可能导致ros indigo的初始化异常,因此,这部分的改动要慎重

$ rm -rf ~/.pyenv/versions/3.6.4/bin/python

安装pip

$ wget https://bootstrap.pypa.io/get-pip.py

$ python3 get-pip.py

$ rm -rf get-pip.py

$ pip3 install --upgrade pip

安装完成之后,需要使用如下命令对数据库进行更新:

$ pyenv rehash
注意事项:
  • 输入python即可使用新版的python
  • 系统自带的脚本会以/usr/bin/python的方式直接调用老版本的python,因而不会对系统脚本产生影响
  • 使用pip安装第三方模块时会安装到~/.pyenv/versions/3.6.4下,不会和系统模块发生冲突
  • 使用pip安装模块后,可能需要执行pyenv rehash更新数据库

参考链接