So Tired !_! 逆水行舟, 不进则退!

27五/21

ubuntu复用danted匿名socks5服务器

发布在 Nick Xu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
cat /etc/danted.conf
 
logoutput: /var/log/dante.log
 
internal: eth0 port = 1080
 
external: tun0
 
#external.rotation: route

socksmethod: username none
 
user.privileged: privoxy
 
user.notprivileged: nobody
 
user.libwrap: nobody
 
client pass {
 
    from: 0.0.0.0/0 port 1-65535 to: 0.0.0.0/0
 
    log: connect disconnect error
 
}
 
#pass {

#    from: 0.0.0.0/0 to: 0.0.0.0/0 port gt 1023

#    command: bind

#    log: connect disconnect

#}

socks pass {
 
    from: 0.0.0.0/0 port 1-65535 to: 0.0.0.0/0
 
    protocol: tcp udp
 
#    command: connect udpassociate

    log: connect disconnect error
 
}
 
#block {

#    from: 0.0.0.0/0 to: 0.0.0.0/0

#    log: connect error

#}
26五/21

openvpn 添加本地路由表

发布在 Nick Xu

默认情况下,VPN 连接成功后会自动增加一些路由,并把网关设置成 vpn 的,所以所有的流量都会通过 VPN 来传送,但是如果使用 openvpn,可以自己修改路由,指定某些 ip 走 vpn,或者某些 ip 不走 vpn,从而达到节省流量或者提高访问速度的目的。openvpn 有两种方法修改路由表:

1. 从客户端修改

这种情况只要改本地配置文件即可,服务器不需要修改。适合客户端比较多且网络条件比较复杂,某些客户端有定制路由的需求,或者临时有修改的情况。例如打开 openvpn 的配置文件 open.ovpn, 在 “max-routes 1000” 后加入相应的路由就:

route 172.16.100.0 0.0.0.0 net_gateway
route 10.252.252.0 255.255.255.0 net_gateway
route 103.103.103.0 255.255.255.0 net_gateway

最后一个参数 “net_gateway” 表示强行指定 IP 段不使用 vpn,还有一个正好相反的 “vpn_gateway” 强行指定 IP 段使用 VPN。

2. 在服务器端配置
在服务器中配置推送全局路由,客户端不需要更改任何配置,适合客户端网络条件比较相似的情况。在 openvpn 服务器的配置文件中加入:

push "route 172.16.100.0 0.0.0.0 net_gateway"
push "route 10.252.252.0 255.255.255.0 net_gateway"
push "route 192.168.1.0 255.255.255.0 net_gateway"
重启服务:
killall openvpn
openvpn --daemon --config /etc/openvpn/2.0/conf/server.conf

windows/linux 下都可以用 “netstat -nr” 来查看路由是否添加成功。
当然 windows/linux 下也可以用 route 命令永久添加路由,采用什么方法,看你的需求和习惯了。

15五/21

ln: error while loading shared libraries: libc.so.6: cannot open shared object处理

发布在 Nick Xu

export LD_PRELOAD=/lib64/libc-2.5.so

后面指定旧的库文件后,复制原版本文件恢复

10五/21

MAC 安装 bsddb

发布在 Nick Xu

wget http://download.oracle.com/berkeley-db/db-6.2.32.tar.gz

  1. 解压到适当的文件夹

cd ./db-6.2.32/build_unix
../dist/configure --prefix =/usr/local/Cellar/berkeley-db/6.2.32
sudo make install

  1. 记住上面的 /usr/local/Cellar/berkeley-db/6.2.32
  2. bsddb3下载 python bsddb3包
  3. wget https://files.pythonhosted.org/packages/f0/24/92034482656945fc6ceb10551222b43a0ff8d0c87e15839120487820067e/bsddb3-6.2.9.tar.gz

  4. 解压后,并 python setup.py install --berkeley-db=/usr/local/Cellar/berkeley-db/6.2.32
    这后面的路径就是 刚刚上面相同的

然后就安装成功了

 

6四/21

ts后缀文件aes加密视频合并并转换为mp4

发布在 Nick Xu

ffmpeg -allowed_extensions ALL -i 2.m3u8 -c copy -bsf:a aac_adtstoasc 2.mp4

29三/21

error: command ‘gcc’ failed with exit status 1 & ImportError: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.18′ not found

发布在 Nick Xu

1.error: command 'gcc' failed with exit status 1

今夜在CentOS release 6.9 和Python 2.7.3环境下,从源码安装pyltp,代码如下:

 

 $ git clone https://github.com/HIT-SCIR/pyltp
 $ git submodule init
 $ git submodule update
 $ python setup.py install # Mac系统出现版本问题使用 MACOSX_DEPLOYMENT_TARGET=10.7 python setup.py install

安装到最后一行:$ python setup.py install
报错:error: command 'gcc' failed with exit status 1

学习了CentOS6.5升级手动安装GCC4.8.2发现是系统自带的gcc(4.4.7) 版本太老所致,不能支持C++11的特性,要升级到4.8.2,以下是正确操作。

1.1获取安装包并解压

 

wget http://ftp.gnu.org/gnu/gcc/gcc-4.9.4/gcc-4.9.4.tar.bz2
tar -jxvf gcc-4.9.4.tar.bz2

此外,http://ftp.gnu.org/gnu/gcc 里面有所有的gcc版本供下载。

1.2 下载供编译需求的依赖项

参考文献Linux升级GCC 4.8.1清晰简明教程(Ubuntu 12.04 64位版为例)中说:这个神奇的脚本文件会帮我们下载、配置、安装依赖库,可以节约我们大量的时间和精力。

 

cd gcc-4.9.4 
./contrib/download_prerequisites 

1.3建立一个目录供编译出的文件存放

 

mkdir gcc-build
cd gcc-build

1.4 生成Makefile文件

 

../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib

1.5 编译(注意:此步骤非常耗时)

 

make -j4

-j4选项是make对多核处理器的优化,如果不成功请使用 make,相关优化选项可以移步至参考文献Ubuntu下Vim+GCC+GDB安装及使用。

1.6、安装

 

sudo make install

验证安装
重启,然后查看gcc版本:

 

gcc -v

如下图安装成功

2. ImportError: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.18' not found (required by /usr/local/lib/python2.7/site-packages/pyltp-0.2.1-py2.7-linux-x86_64.egg/pyltp.so)

运行pyltp程序时报错:

 

ImportError: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.18' not found 
(required by /usr/local/lib/python2.7/site-packages/pyltp-0.2.1-py2.7-linux-x86_64.egg/pyltp.so)

学习Linux下GLIBCXX和GLIBC版本低造成的编译错误的解决方案后发现是一个是关于C++的系统版本库libstdc++版本过低的问题。

1.1首先查看错误信息提示中的lib文件的信息

 

$ strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBC 

这里是打印 libstdc++.so.6的输出信息中限定(grep) GLIBC库的信息,查看当前GLIBCXX版本结果如图所示:

确实比较旧了,那么我们有新版本么?我们安装了gcc 4.8.0,按理说应该已经装了新版的libstdC++.,如果没有,可以去网上下一个。

先在本机找:

 

find / -name libstdc++.so.6*

结果如图所示:

我们发现,gcc安装时把/libstdc++.so.6.0.18 安装到了/usr/local/lib64下,但并没有改变libstdc++.so.6的链接指向。那么我们手动来更新软链接(也可以直接指向/usr/local下的文件,不用拷贝, 看各自的文件管理习惯)

 

$ cp /usr/local/lib64/libstdc++.so.6.0.18 /usr/lib/x86_64-linux-gnu
$ rm -rf /usr/lib64/libstdc++.so.6
$ ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.18 /usr/lib/x86_64-linux-gnu/libstdc++.so.6
$ strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBC

然后更新成功,结果如下图:

此时再运行.py文件,GLIBCXX的问题没有了。

19八/20

解决python3.7与openssl的低版本不兼容的问题

发布在 Nick Xu

安装了Python3.7之后,遇到的一个很麻烦的坑就是与系统自带的ssl版本不兼容, Python3.7需要的openssl的版本为1.0.2或者1.1.x,这个requirements在config Python3.7的时候使用“--with-ssl”选项会报出。

  1. Could not build the ssl module!
  2. Python requires an OpenSSL 1.0.2 or 1.1 compatible libssl with X509_VERIFY_PARAM_set1_host().

Linux系统默认的openssl版本通常是:OpenSSL 1.0.1,可以使用命令查询系统的openssl版本:

openssl version

当前版本低于Python3.7的需求,会导致一些运行错误,比如pip3 install命令的失败,故需要进行openssl版本升级。

(1)下载较高版本的openssl


https://www.openssl.org/source/openssl-1.1.1g.tar.gz (2)解压安装包

tar -xvzf openssl-1.1.1g.tar.gz

(3)编译安装

  1. cd openssl-1.1.1g
  2. ./config --prefix=/usr/local/openssl no-zlib # 新版openssl将安装在/usr/local/openssl目录下
  3. make
  4. make install

这样的话,新版本的openssl已经安装完毕,但是需要进行一些环境配置才能够继续使用。

来到/usr/bin目录下,可以发现已经有一个openssl可执行文件,这个就是系统自带的低版本,这里我们对它进行一个备份。

(4)备份原openssl配置

备份是个好的习惯,至少在安装新版本出错的时候可以回滚旧版本继续使用。

  1. mv /usr/bin/openssl /usr/bin/openssl_bak # backup
  2. mv /usr/include/openssl/ /usr/include/openssl_bak

(5)备份好之后就可以为新版openssl配置软连接了

  1. # 将安装好的openssl的openssl命令软连到/usr/bin/openssl
  2. ln -s /usr/local/openssl/include/openssl /usr/include/openssl
  3. # 软链到升级后的libssl.so
  4. ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/local/lib64/libssl.so
  5. # 将安装好的openssl命令软连到/usr/bin/openssl
  6. ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl

(6)最后再修改下系统配置即可

  1. # 写入openssl库文件的搜索路径
  2. echo "/usr/local/openssl/lib" >> /etc/ld.so.conf # 需要root权限
  3. # 使修改后的/etc/ld.so.conf生效
  4. ldconfig -v

(7)验证安装结果

 

第二步:安装 LibreSSL

从 LibreSSL 官网 http://www.libressl.org/ 下载源代码。此处使用“libressl-2.8.2.tar.gz”。

 

以此执行以下命令安装:

#wget https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.8.2.tar.gz
#tar xzvf libressl-2.8.2.tar.gz
#cd libressl-2.8.2
#./config
#make
#make install

 

此时再验证 OpenSSL 版本,如下:

#openssl version
LibreSSL 2.8.2
18八/20

常用基本AT指令

发布在 Nick Xu

常用基本AT指令

 

命令
作用

AT
测试连接是否正确

ATE0
关闭回显。程序初始化AT部分首先关闭回显。

ATE1
打开回显。使用超级终端测试命令时打开。

AT+CGMI
得到厂商信息

AT+CGMR
得到手机版本号

AT+CGSN
得到手机序列号(IMEI)

AT+CIMI
得到手机IMSI号码

AT+CSCS
获取、设置手机当前字符集。可设置为GSM或UCS2

AT+CBC
获取手机电量

AT+CCLK
获取设置手机时钟

AT+CNUM
机身号码。分为线路一和线路二

AT+CSQ
当前信号

AT+COPS
网络营运商

AT+CSCA
短信中心号码

以上这些指令都用于与手机连接的时候初始化用。取得手机IMEI及IMSI可以给使程序支持更多的手机连接

并且保持数据独立。

短信部分

 

命令
作用

AT+CPMS
选择短信储存地点。可选择ME(SIM卡)和MT(机身)

AT+CMGL
列出指定状态的短信息的PDU代码

AT+CMGR
列出指定序号的短信息PDU代码

AT+CMGS
发送短信

AT+CMGD
删除指定的短信

AT+CMGF
短信格式。分为Text模式和PDU模式

AT+CNMI
设置新短消息通知电脑端

AT+CSCA
短信中心

以上命令是短消息部分最经常使用的命令。

一、一般命令
 AT+CGMI给出模块厂商的标识。
 AT+CGMM获得模块标识。这个命令用来得到支持的频带(GSM900,DCS1800或PCS1900)。当模块有多频带时,回应可能是不同频带的结合。
 AT+CGMR获得改订的软件版本。
 AT+CGSN获得GSM模块的IMEI(国际移动设备标识)序列号。
 AT+CSCS选择TE特征设定。这个命令报告TE用的是哪个状态设定上的ME。ME于是可以转换每一个输入的或显示的字母。这个是用来发送、读取或者撰写短信。
 AT+WPCS设定电话簿状态。这个特殊的命令报告通过TE电话簿所用的状态的ME。ME于是可以转换每一个输入的或者显示的字符串字母。这个用来读或者写电话簿的入口。
 AT+CIMI获得IMSI。这命令用来读取或者识别SIM卡的IMSI(国际移动签署者标识)。在读取IMSI之前应该先输入PIN(如果需要PIN的话)。
 AT+CCID获得SIM卡的标识。这个命令使模块读取SIM卡上的EF-CCID文件。
 AT+GCAP获得能力表。(支持的功能)
 A/ 重复上次命令。只有A/命令不能重复。这命令重复前一个执行的命令。
 AT+CPOF关机。这个特殊的命令停止GSM软件堆栈和硬件层。命令AT+CFUN=0的功能与+CPOF相同。
 AT+CFUN设定电话机能。这个命令选择移动站点的机能水平。
 AT+CPAS返回移动设备的活动状态。
 AT+CMEE报告移动设备的错误。这个命令决定允许或不允许用结果码“+CMEERROR:<xxx>”或者“+CMSERROR:<xxx>”代替简单的“ERROR”。
 AT+CKPD小键盘控制。仿真ME小键盘执行命令。
 AT+CCLK时钟管理。这个命令用来设置或者获得ME真实时钟的当前日期和时间。
 AT+CALA警报管理。这个命令用来设定在ME中的警报日期/时间。(闹铃)
 AT+CRMP铃声旋律播放。这个命令在模块的蜂鸣器上播放一段旋律。有两种旋律可用:到来语音、数据或传真呼叫旋律和到来短信声音。
 AT+CRSL设定或获得到来的电话铃声的声音级别。
二、呼叫控制命令
 ATD拨号命令。这个命令用来设置通话、数据或传真呼叫。
 ATH挂机命令。
 ATA接电话。
 AT+CEER扩展错误报告。这个命令给出当上一次通话设置失败后中断通话的原因。
 AT+VTD给用户提供应用GSM网络发送DTMF(双音多频)双音频。这个命令用来定义双音频的长度(默认值是300毫秒)。
 AT+VTS给用户提供应用GSM网络发送DTMF双音频。这个命令允许传送双音频。
 ATDL重拨上次电话号码。
 AT%Dn数据终端就绪(DTR)时自动拨号。
 ATS0自动应答。
 AT+CICB来电信差。
 AT+CSNS单一编号方案。
 AT+VGR
 AT+VGT增益控制。这个命令应用于调节喇叭的接收增益和麦克风的传输增益。
 AT+CMUT麦克风静音控制。
 AT+SPEAKER喇叭/麦克风选择。这个特殊命令用来选择喇叭和麦克风。
 AT+ECHO回音取消。
 AT+SIDET侧音修正。
 AT+VIP初始化声音参数。
 AT+DUI用附加的用户信息拨号。
 AT+HUI用附加的用户信息挂机。
 AT+RUI接收附加用户信息。
三、网络服务命令
 AT+CSQ信号质量。
 AT+COPS服务商选择。
 AT+CREG网络注册。获得手机的注册状态。
 AT+WOPN读取操作员名字。
 AT+CPOL优先操作员列表。
四、安全命令
 AT+CPIN输入PIN。
 AT+CPIN2输入PIN2。
 AT+CPINCPIN的剩余的尝试号码。
 AT+CLCK设备锁。
 AT+CPWD改变密码。
五、电话簿命令
 AT+CPBS选择电话簿记忆存储。
 AT+CPBR读取电话簿表目。
 AT+CPBF查找电话簿表目。
 AT+CPBW写电话簿表目。
 AT+CPBP电话簿电话查询。
 AT+CPBN电话簿移动动作。这个特殊命令使电话簿中的条目前移或后移(按字母顺序)
 AT+CNUM签署者号码。
 AT+WAIP防止在下一次重起时初始化所有的电话簿。
 AT+WDCP删除呼叫电话号码。
 AT+CSVM设置语音邮件号码。
六、短消息命令
 AT+CSMS选择消息服务。支持的服务有GSM-MO、SMS-MT、SMS-CB。
 AT+CNMA新信息确认应答。
 AT+CPMS优先信息存储。这个命令定义用来读写信息的存储区域。
 AT+CMGF优先信息格式。执行格式有TEXT方式和PDU方式。
 AT+CSAS保存设置。保存+CSAS和+CSMP的参数。
 AT+CRES恢复设置。
 AT+CSDH显示文本方式的参数。
 AT+CNMI新信息指示。这个命令选择如何从网络上接收短信息。
 AT+CMGR读短信。信息从+CPMS命令设定的存储器读取。
 AT+CMGL列出存储的信息。
 AT+CMGS发送信息。
 AT+CMGW写短信息并存储。
 AT+CMSS从存储器中发送信息。
 AT+CSMP设置文本模式的参数。
 AT+CMGD删除短信息。删除一个或多个短信息。
 AT+CSCA短信服务中心地址。
 AT+CSCB选择单元广播信息类型。
 AT+WCBM单元广播信息标识。
 AT+WMSC信息状态(是否读过、是否发送等等)修正。
 AT+WMGO信息覆盖写入。
 AT+WUSS不改变SMS状态。在执行+CMGR或+CMGL后仍保持UNREAD。
七、追加服务命令
 AT+CCFC呼叫继续。
 AT+CLCK呼叫禁止。
 AT+CPWD改变追加服务密码。
 AT+CCWA呼叫等待。
 AT+CLIR呼叫线确认限制。
 AT+CLIP呼叫线确认陈述。
 AT+COLP联络线确认陈述。
 AT+CAOC费用报告。
 AT+CACM累计呼叫计量。
 AT+CAMM累计呼叫计量最大值。
 AT+CPUC单价和货币表。
 AT+CHLD呼叫相关的追加服务。
 AT+CLCC列出当前的呼叫。
 AT+CSSN追加服务通知。
 AT+CUSD无组织的追加服务数据。
 AT+CCUG关闭的用户组。

 

 

AT命令交互之-COPS选择营运商

模块默认一般都可以自动搜网注册,比如移动的就注册到移动,联通的就注册到联通。但是在不同的国家多网覆盖的使用情况下,有时候就算使用了自动搜网注册网络,也会出现注册不上网络的现象,这时候就需要使用手动搜网然后选择一个运营商进行强制注册。

 

1.AT+COPS命令说明

image.png

  1. 上面格式里面,stat这个值比较重要,他会直接告诉我们哪些运营商可用。
  2. <stat>
  3. 0 未知
  4. 1 可用
  5. 2 当前
  6. 3 禁用
  7. <oper>
  8. 运营商名称,根据 format 给出
  9. <mode>
  10. 0 自动注册 (忽略<format> <oper> 参数)
  11. 1 手动注册
  12. 2 强制注销
  13. 3 只设置格式
  14. 4 先手动再自动
  15. <format>
  16. 0 长字符格式<oper>
  17. 1 短字符格式<oper>
  18. 2 数字格式<oper>
  19. <AcT> 接入技术
  20. 0 GSM
  21. 1 GSM COMPACT
  22. 2 UTRAN
  23. 1. 配置命令选择并注册 GSM 网络营运商。<mode>设置 ME 是自动选择营运商<oper>,还是使用该命
  24. 令强制选择营运商<oper>
  25.  当<mode>=0 时,ME 将自动尝试选择可使用的运营商。
  26.  当<mode>=1 时,ME 将强制注册选择的<oper>运营商,若该运营商无效则当前 ME 不会搜索
  27. 其他可用运营商,直到<mode>=0 时 ME 才会重新注册网络。如果 ME 重启后仍然在<mode>=1
  28. 下且没有 RPLMN 的话,ME 会保持在不注册网络的状态直到使用命令改变成自动注册模式。
  29.  当<mode>=4 时,若手动选择运营商不可用,ME 会自动选择当前网络中可用运营商继续尝试注
  30. 册。
  31. 2. 该命令设置成功后会自动保存。

2.AT+COPS=?搜网

1.模块未插入SIM卡

我们想使用AT+COPS=?进行搜网,这时会有两种情况,一种是模块没插入卡,返回如下:

 

image.png

如上面所示,没插卡的时候返回的运营stat都是1,都是可以用运营商。

2.模块插入指定运营商的SIM卡

现在插入电信卡,在进行搜网操作

image.png

可以看到虽然返回了三个运营商,但是只有电信的stat是1,其他两个stat都是3,forbidden。

3.AT+COPS=设置网络

1.手动设网,已知要设置的网络

  1. 1.强制注销网络 AT+COPS=2,2
  2. 2.设置要使用的网络 AT+COPS=1,2,"46001",2
  3. 3.设置查询格式 AT+COPS=3,2 数字型
  4. 4.查询当前运营商 AT+COPS?

image.png

2.手动设网,未知要设置的网络

  1. 1.设置格式 AT+COPS=3,0 长字符型
  2. 2.查询可用运营商 AT+COPS=?
  3. 3.强制注销网络 AT+COPS=2,2
  4. 4.设置要使用的网络 AT+COPS=1,2,"46001",2
  5. 5.设置查询格式 AT+COPS=3,2 数字型
  6. 6.查询当前运营商 AT+COPS?

image.png

 

联通2G基本退网了

 

 

查询命令:AT+CGREG?
返回:+CGREG:<n>,<stat>[,<lac>,<ci>]   OK

参数  取值 说明
n  [0] 禁用网络注册非请求结果码+CGREG:
[1] 启用网络注册非请求结果码
[2] 启用网络注册和位置信息非请求结果码+CGREG:<stat>[,<lac>,<ci>]

<stat> [0] 未注册;ME 当前没有搜索注册业务的新运营商
[1] 已注册,本地网
[2] 未注册,但ME 正在搜索注册业务的新运营商
[3] 注册被拒绝
[4] 未知
[5] 已注册,漫游

<lac> 字符型;2 位十六进制位置区代码(比如:00C3相当于十进制中的195)
<ci> 字符型;2 位十六进制小区编号

17八/20

pyenv 让 python 版本完美切换

发布在 Nick Xu

前言

我觉得如果使用 python 开发的话,还是在 unix/linux 的环境下吧,shell 工具的效率比 windows 高得多,尽管 windows 下也有 cmder 这种神器,而且现在 windows store 也很好的开发出了 linux 子系统,但是瑕疵非常多,unix/linux 才是完美的环境。本文用到的是 archlinux ,另外 debian/ubuntu、centos 也完全适用。mac 用户也可以参考,不过 homebrew 也提供了非常方便的安装方法,但是建议使用文本做法。

背景

python 版本比较多,2 和 3 相差非常大,很多项目需要跑在同一台服务器上,我们可以选择直接运行,也可以选择使用 docker。如果用 docker 那就不需要隔离环境了,如果要直接运行在服务器上,那就必须有隔离环境。比如有的项目使用 python 3.5,有的项目使用 python 3.7,此时我们可以借助 pyenv 帮助我们完美的隔离环境,让多个版本的 python 没有任何冲突,完美共存。

任务

使用 pyenv 和 pyenv-virtualenv ,在 linux 下完美隔离 python 各个版本

第 1 章:使用环境

请注意,接下来所有的操作都在 archlinux 下进行,本文不涉及 windows

清单

  1. git
  2. zsh 或者 bash
  3. pyenv
  4. pyenv-virtualenv

1、安装 git

在各大 linux 的发行版下安装 git 都非常简单,此处只展示部分示例

archlinux

sudo pacman -S git

debian/ubuntu

sudo apt-get install git

centos

sudo yum install git

2、开启终端

本文使用 zsh

3、安装 pyenv

说明:本文的所有安装都严格遵守官方文档,与官方文档完全保持一致。

git 地址:https://github.com/pyenv/pyenv

在你的终端中执行如下命令,安全无毒,请放心食用:

首先把项目克隆下来,放在家目录下的隐藏文件夹中:.pyenv

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

然后配置环境变量

如果你使用 bash,就依次执行如下命令:

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

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

echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bashrc

如果你使用 zsh,就依次执行如下命令:

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

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

echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.zshrc

echo 命令的含义是:将引号中内容写入某文件中
请注意,以上的三条 echo 命令的最后一条长长的命令,请你保证它引号中的内容处于 ~/.bashrc 或者 ~/.zshrc 的最底部。
因为在 pyenv 初始化期间会操作 path 环境变量,导致不可预测的行为。
查看文件的底部内容,可以使用 tail 命令,用法:tail ~/.bashrc 或者 tail ~/.zshrc,编辑文件可以使用 vim 或者 vscode

最后,在使用 pyenv 之前,重新初始化 shell 环境,执行如下命令

exec $SHELL

不执行该命令也是完全可以的,你可以关闭当前的终端窗口,重新启动一个就可以了。

此时,你已经完成了 pyenv 的安装了,你使用可以它的全部命令了,但是我建议你先别急着用,一口气装完 pyenv 的一个插件,那就是 pyenv-virtualenv

4、安装 pyenv-virtualenv

git 地址:https://github.com/pyenv/pyenv-virtualenv

把插件克隆在刚才已经安装完毕的 pyenv 的 plugins 文件夹中

git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv

然后配置环境变量

如果你使用 bash,就执行如下命令:

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

如果你使用 zsh,就执行如下命令:

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

最后,在使用 pyenv 之前,重新初始化 shell 环境,执行如下命令

exec $SHELL

不执行该命令也是完全可以的,你可以关闭当前的终端窗口,重新启动一个就可以了。

到此,我们的所有重要安装已经全部完成了,可以开始体验了。

第 2 章:使用 pyenv

此处仅仅展示 pyenv 和 virtualenv 的日常用法

检查安装是否正确

检查 pyenv 的版本

pyenv version

查看 pyenv 已经托管了哪些 python 版本

pyenv versions

如果你看到了正常的版本信息,就说明可以了,如果看到了类似于 command not found 之类的,就说明安装失败了。

安装 3.6.6 版本的 python

pyenv install 3.6.6

这里有个问题,某些情况下会安装失败,报错就告诉你 Build failed

这个时候,pyenv 已经在它的 github wiki 里面为我们准备了一篇错误应对方案,原文地址 https://github.com/pyenv/pyenv/wiki

大意如下,只需要执行对应的命令即可:

archlinux 用户

sudo pacman -S base-devel openssl zlib

mac 用户

brew install openssl readline sqlite3 xz zlib

Ubuntu/Debian/Mint 用户

sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev

CentOS/Fedora <= 21 用户,请你保证已经安装了 xz 工具

sudo yum install gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel libffi-devel

Fedora >= 22 用户,请你保证已经安装了 xz 工具

sudo dnf install -y gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel

openSUSE 用户

zypper install gcc automake openssl-devel ncurses-devel readline-devel zlib-devel tk-devel

Solus 用户

sudo eopkg it -c system.devel

sudo eopkg install git gcc make zlib-devel bzip2-devel readline-devel sqlite3-devel openssl-devel tk-devel

Linuxbrew 用户

brew install bzip2 openssl readline sqlite xz

安装完这些补充的工具之后,再次执行:

pyenv install 3.6.6

就可以成功了,你可以不断的使用

pyenv versions

来查看被 pyenv 托管的 python 版本

而且你想装什么版本就装什么版本,想装几个装几个,都是完美共存,完美隔离,你可以在终端里输入

pyenv install

然后按下 tab 键,就可以看到所有可选的安装版本了

使用刚才安装的 python 3.6.6

首先我们需要明确一个概念,pyenv 和 pyenv-virtualenv 他们是如何协作的,你可以这么认为:

pyenv 托管 python 版本,virtualenv 使用 python 版本

好了,之前已经装好了版本,那么现在就来使用吧

第 1 步:创建虚拟环境

首先需要创建一个虚拟环境,执行命令:

pyenv virtualenv 3.6.6 my-env

它的格式就是这样固定的,最后一个是你自己想要的环境的名字,可以随便取。稍等片刻,你将会看到:

Looking in links: /tmp/tmp0eywgc7v
Requirement already satisfied: setuptools in /home/joit/.pyenv/versions/3.6.6/envs/my-env/lib/python3.6/site-packages (39.0.1)
Requirement already satisfied: pip in /home/joit/.pyenv/versions/3.6.6/envs/my-env/lib/python3.6/site-packages (10.0.1)

类似于这样的回显信息,说明环境已经创建成功了,它还告诉了你,该虚拟环境的绝对路径,如果你进去看了,你就会发现,所谓的虚拟环境,就是把 python 装在 pyenv 的安装目录的某个文件夹中,以供它自己调用。

第 2 步:激活虚拟环境

在任意目录下,执行命令:

pyenv activate my-env

你会发现,在你的终端里面,多了一个类似于 (my-env) 这样的一个东西,这时候你如果执行:

python --version

那就是 python 3.6.6 了

如果你执行:

pip --version

它会告诉你 pip 包安装的绝对路径,也是 pyenv 安装目录下的某个文件夹

如果你关掉了终端,那么下次启动你又得重新激活一次了,你可以使用如下命令:

首先 cd 到某一个目录,比如 ~/test

cd ~/test

然后在该目录下执行:

pyenv local my-env

你会发现已经被激活了,那么 local 命令和刚才有啥不同呢。如果你执行:

ls -al

你就会发现,在 ~/test 目录下,有个隐藏文件 .python-version,你可以看到这个文件里面,只写了一句话 my-env

这样你只要进入 ~/test 目录,就会自动激活虚拟环境

在虚拟环境下,你如果直接执行

python

就会进入到 python 的交互环境

如果你写了一个文件,名字叫做 app.py ,里面的内容只有一句代码:print(1)

然后执行:

python app.py

这时候,系统就会调用虚拟环境中的 python 解释器来执行这些代码了

第 3 章:更新 pyenv

由于我们是 git 克隆的,所以更新非常简单

cd ~/.pyenv 或者 cd $(pyenv root)
git pull

第 4 章:卸载 pyenv

由于 pyenv 把一切都放在 ~/.pyenv 下了,所以卸载很方便,两个步骤就行了

首先你需要删除环境变量

然后你需要执行:

rm -rf ~/.pyenv 或者 rm -rf $(pyenv root)

作者:JoiT
链接:https://www.jianshu.com/p/3e93311fe6cb
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

24三/20

homebrew安装和解决brew安装速度慢的问题

发布在 Nick Xu

homebrew安装

ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”

解决brew安装速度慢的问题(替换homebrew镜像源)

1.替换brew.git:

cd $(brew --repo)
git remote set-url origin https://mirrors.aliyun.com/homebrew/brew.git

2.替换homebrew-core.git:

cd $(brew --repo)/Library/Taps/homebrew/homebrew-core
git remote set-url origin https://mirrors.aliyun.com/homebrew/homebrew-core.git

3.终端输入命令:

echo $SHELL 看输出结果是/bin/zsh还是/bin/bash

  • /bin/zsh替换homebrew-bottles:
echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.aliyun.com/homebrew/homebrew-bottles' >> ~/.zshrc
source ~/.zshrc
  • /bin/bash替换homebrew-bottles:
echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.bash_profile
source ~/.bash_profile

4.恢复homebrew国内镜像源配置

  • 重置brew.git
cd $(brew --repo)
git remote set-url origin https://github.com/Homebrew/brew.git
  • 重置homebrew-core.git
cd $(brew --repo)/Library/Taps/homebrew/homebrew-core
git remote set-url origin https://github.com/Homebrew/homebrew-core.git
  • 重置homebrew-bottles
将刚添加到~/.bash_profile文件的语句注释掉即可

解决brew安装包一直卡在Updating Homebrew

运行命令brew install node,结果界面一直卡在Updating Homebrew上,有两种解决办法

方法一:关闭brew每次执行命令时的自动更新(推荐)

vim ~/.bash_profile
# 新增一行
export HOMEBREW_NO_AUTO_UPDATE=true

方法二(懒人方法):

出现Updating Homebrew的时候ctrl+c一下就行
标签: 评论关闭
   下一页
site
site