MySQL5.7 supports a native JSON data type, and how to use it?

数据结构与算法网站管理员 发表了文章 • 0 个评论 • 50 次浏览 • 5 天前 • 来自相关话题

mysql5.7已经支持JSON的数据结构,意味着我们可以更加方便的对JSON结构的数据进行增删改成

### 什么是JSON?

> JSON: JavaScript Object Notation(JavaScript 对象表示法)
> JSON 是存储和交换文本信息的语法。类似 XML。
> JSON 比 XML 更小、更快,更易解析。
> JSON 具有自我描述性,更易理解

### 建立表,添加JSON的数据结构字段col

建表qtest,然后添加col的字段,其数据类型为JSON,插入一条JSON字符串,然后发现添加不是json结构的数据
mysql会给我们报如下错误```ERROR 3140 (22032) at line 2: Invalid JSON text:```,表明我们插入的是非法JSON。

```json
{"mascot": "Our mascot is a dolphin named \"Sakila\"."}
```

```mysql
mysql> CREATE TABLE qtest (col JSON);
Query OK, 0 rows affected (0.20 sec)

mysql> INSERT INTO t1 VALUES('{"mascot": "Our mascot is a dolphin named \"Sakila\"."}');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO t1 VALUES('[1, 2,');
ERROR 3140 (22032) at line 2: Invalid JSON text:
"Invalid value." at position 6 in value (or column) '[1, 2,'.
```

### 如何查询JSON的某个字段

1. 字段指向一个字符串,由```$.name```组成,美元符号+字段名称

```mysql
mysql> SELECT col->"$.mascot" FROM qtest;
+---------------------------------------------+
| col->"$.mascot" |
+---------------------------------------------+
| "Our mascot is a dolphin named \"Sakila\"." |
+---------------------------------------------+
1 row in set (0.00 sec)
```

2. 查询数组```$[0]```,美元符号+中括号及数组索引

```mysql
mysql> select *from sourcedev;
+----+------------------------------+-----------+
| id | category | tags |
+----+------------------------------+-----------+
| 1 | {"id": 1, "name": "sourcedev.cc"} | [1, 2, 3] |
+----+------------------------------+-----------+
1 row in set (0.00 sec)

mysql> select id, category->'$.id', tags->'$[0]' from sourcedev;
+----+------------------+--------------+
| id | category->'$.id' | tags->'$[0]' |
+----+------------------+--------------+
| 1 | 1 | 1 |
+----+------------------+--------------+
1 row in set (0.00 sec)
```

### mysql5.7 JSON相关函数

1. JSON_TYPE JSON类型,ARRAY、STRING
所有的Json type类型如下
```
BLOB
BIT
OPAQUE
DATETIME
TIME
DATE
BOOLEAN
ARRAY
OBJECT
STRING
INTEGER, DOUBLE
NULL
```

2. JSON_ARRAY ```SELECT JSON_ARRAY('a', 1, NOW());```

```mysql
mysql> SELECT JSON_ARRAY('a', 1, NOW());
+----------------------------------------+
| JSON_ARRAY('a', 1, NOW()) |
+----------------------------------------+
| ["a", 1, "2015-07-27 09:43:47.000000"] |
+----------------------------------------+
```

3. JSON_OBJECT
```mysql
mysql> SELECT JSON_OBJECT('key1', 1, 'key2', 'abc');
+---------------------------------------+
| JSON_OBJECT('key1', 1, 'key2', 'abc') |
+---------------------------------------+
| {"key1": 1, "key2": "abc"} |
+---------------------------------------+
```
4. 等等


### 引用

1. [百度百科 #https://baike.baidu.com/item/JSON/2462549](https://baike.baidu.com/item/JSON/2462549)
2. [mysql5.7官方文档 #https://dev.mysql.com/doc/refman/8.0/en/json.html](https://dev.mysql.com/doc/refman/8.0/en/json.html) 查看全部

mysql5.7已经支持JSON的数据结构,意味着我们可以更加方便的对JSON结构的数据进行增删改成

### 什么是JSON?

> JSON: JavaScript Object Notation(JavaScript 对象表示法)
> JSON 是存储和交换文本信息的语法。类似 XML。
> JSON 比 XML 更小、更快,更易解析。
> JSON 具有自我描述性,更易理解

### 建立表,添加JSON的数据结构字段col

建表qtest,然后添加col的字段,其数据类型为JSON,插入一条JSON字符串,然后发现添加不是json结构的数据
mysql会给我们报如下错误```ERROR 3140 (22032) at line 2: Invalid JSON text:```,表明我们插入的是非法JSON。

```json
{"mascot": "Our mascot is a dolphin named \"Sakila\"."}
```

```mysql
mysql> CREATE TABLE qtest (col JSON);
Query OK, 0 rows affected (0.20 sec)

mysql> INSERT INTO t1 VALUES('{"mascot": "Our mascot is a dolphin named \"Sakila\"."}');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO t1 VALUES('[1, 2,');
ERROR 3140 (22032) at line 2: Invalid JSON text:
"Invalid value." at position 6 in value (or column) '[1, 2,'.
```

### 如何查询JSON的某个字段

1. 字段指向一个字符串,由```$.name```组成,美元符号+字段名称

```mysql
mysql> SELECT col->"$.mascot" FROM qtest;
+---------------------------------------------+
| col->"$.mascot" |
+---------------------------------------------+
| "Our mascot is a dolphin named \"Sakila\"." |
+---------------------------------------------+
1 row in set (0.00 sec)
```

2. 查询数组```$[0]```,美元符号+中括号及数组索引

```mysql
mysql> select *from sourcedev;
+----+------------------------------+-----------+
| id | category | tags |
+----+------------------------------+-----------+
| 1 | {"id": 1, "name": "sourcedev.cc"} | [1, 2, 3] |
+----+------------------------------+-----------+
1 row in set (0.00 sec)

mysql> select id, category->'$.id', tags->'$[0]' from sourcedev;
+----+------------------+--------------+
| id | category->'$.id' | tags->'$[0]' |
+----+------------------+--------------+
| 1 | 1 | 1 |
+----+------------------+--------------+
1 row in set (0.00 sec)
```

### mysql5.7 JSON相关函数

1. JSON_TYPE JSON类型,ARRAY、STRING
所有的Json type类型如下
```
BLOB
BIT
OPAQUE
DATETIME
TIME
DATE
BOOLEAN
ARRAY
OBJECT
STRING
INTEGER, DOUBLE
NULL
```

2. JSON_ARRAY ```SELECT JSON_ARRAY('a', 1, NOW());```

```mysql
mysql> SELECT JSON_ARRAY('a', 1, NOW());
+----------------------------------------+
| JSON_ARRAY('a', 1, NOW()) |
+----------------------------------------+
| ["a", 1, "2015-07-27 09:43:47.000000"] |
+----------------------------------------+
```

3. JSON_OBJECT
```mysql
mysql> SELECT JSON_OBJECT('key1', 1, 'key2', 'abc');
+---------------------------------------+
| JSON_OBJECT('key1', 1, 'key2', 'abc') |
+---------------------------------------+
| {"key1": 1, "key2": "abc"} |
+---------------------------------------+
```
4. 等等


### 引用

1. [百度百科 #https://baike.baidu.com/item/JSON/2462549](https://baike.baidu.com/item/JSON/2462549)
2. [mysql5.7官方文档 #https://dev.mysql.com/doc/refman/8.0/en/json.html](https://dev.mysql.com/doc/refman/8.0/en/json.html)


wepy1.x升级wepy2.x,wepy如何实现大的版本升级升级

小程序网站管理员 发表了文章 • 0 个评论 • 72 次浏览 • 2019-07-06 14:20 • 来自相关话题

要从wepy1.x升级到2.x这是一件比较困难的事情,因为框架的整个语法都发生了变化。正如官方所言:

> WePY 2 并不是基于 WePY 1 作的版本升级,而是完全重新开发的全新版本。因为实现原理完全不一样,因些比较难实现完全的向下兼容。

与其苦苦纠结如何升级,不如拥抱全新的版本,2.x实现了对typescript的支持,所以我们可以更加愉快的写代码

### 关于wepy1.x和wepy2.x的差异

> 1. 入口申请调整,WePY 1 使用类的继承方式 export default class MyPage extends wepy.page {} 在 WePY 2 中调整为 wepy.page({})。将实例化的过程放在生命周期事件中。

> 2. 数据绑定机制调整,WePY 1 使用脏检查进行数据绑定,却让开发者不知道使用时候去调用 $apply() 方法。在 WePY 2 中使用了 Vue Observer 实现数据绑定,告别$apply()。

> 3. 基于原生组件,WePY 1 是通过文件编译创建的静态组件在动态循环遍历时会出现一些问题,WePY 2 直接基于的小程序原生的组件去实现,避免了这一类问题。

> 4. Vue 模板语法,WePY 2 中推荐使用 HTML 代替 wxml 来写 template,支持除 filter 之外的所有 Vue 模板语法。

> 5. 编译方式改变,WePY 2 从基于文件编译调整为基于入口编译,因此对于图片等静态资源需要指定 static 选项 。


### 引用

[wepy官方2.x文档](https://wepyjs.github.io/wepy-docs/2.x/#/) 查看全部

要从wepy1.x升级到2.x这是一件比较困难的事情,因为框架的整个语法都发生了变化。正如官方所言:

> WePY 2 并不是基于 WePY 1 作的版本升级,而是完全重新开发的全新版本。因为实现原理完全不一样,因些比较难实现完全的向下兼容。

与其苦苦纠结如何升级,不如拥抱全新的版本,2.x实现了对typescript的支持,所以我们可以更加愉快的写代码

### 关于wepy1.x和wepy2.x的差异

> 1. 入口申请调整,WePY 1 使用类的继承方式 export default class MyPage extends wepy.page {} 在 WePY 2 中调整为 wepy.page({})。将实例化的过程放在生命周期事件中。

> 2. 数据绑定机制调整,WePY 1 使用脏检查进行数据绑定,却让开发者不知道使用时候去调用 $apply() 方法。在 WePY 2 中使用了 Vue Observer 实现数据绑定,告别$apply()。

> 3. 基于原生组件,WePY 1 是通过文件编译创建的静态组件在动态循环遍历时会出现一些问题,WePY 2 直接基于的小程序原生的组件去实现,避免了这一类问题。

> 4. Vue 模板语法,WePY 2 中推荐使用 HTML 代替 wxml 来写 template,支持除 filter 之外的所有 Vue 模板语法。

> 5. 编译方式改变,WePY 2 从基于文件编译调整为基于入口编译,因此对于图片等静态资源需要指定 static 选项 。


### 引用

[wepy官方2.x文档](https://wepyjs.github.io/wepy-docs/2.x/#/)

为什么我建议使用Medium来学习技术,练习英语?

随想录网站管理员 发表了文章 • 0 个评论 • 61 次浏览 • 2019-07-04 15:52 • 来自相关话题

Medium是国外的一个写作平台,每个月有一定的免费阅读文章的机会,但是如果超过限制,需要升级账号,每个月5每刀,一年是50美刀,折扣10美刀,大概需要支付人民币333每年。

Medium的运营模式被国内的一些平台模仿, 但是很难做到它的精髓,怎么说呢?

国内抄袭比较严重,如果涉及到利益的话,很容易滋生灰色产业,洗稿文章满天飞。

为什么建议在Medium上学习文章呢?Medium有很多的大牛,而且文章内容涉及的领域十分的广泛。这是一个不错的的平台,可以帮助我们学习技术和练习英语,如果我们有翻译的兴趣的话,可以将这些文章翻译之后分享到国内的平台,增加自己的影响力,同时也提升了自身的阅读和翻译能力,也学习了前沿的技术。 查看全部
Medium是国外的一个写作平台,每个月有一定的免费阅读文章的机会,但是如果超过限制,需要升级账号,每个月5每刀,一年是50美刀,折扣10美刀,大概需要支付人民币333每年。

Medium的运营模式被国内的一些平台模仿, 但是很难做到它的精髓,怎么说呢?

国内抄袭比较严重,如果涉及到利益的话,很容易滋生灰色产业,洗稿文章满天飞。

为什么建议在Medium上学习文章呢?Medium有很多的大牛,而且文章内容涉及的领域十分的广泛。这是一个不错的的平台,可以帮助我们学习技术和练习英语,如果我们有翻译的兴趣的话,可以将这些文章翻译之后分享到国内的平台,增加自己的影响力,同时也提升了自身的阅读和翻译能力,也学习了前沿的技术。

js从Excel拿到日期是一个浮点小数,时间格式问题怎么转换为时间戳?

前端网站管理员 发表了文章 • 0 个评论 • 109 次浏览 • 2019-06-20 15:23 • 来自相关话题

### 背景

js从excel中拿到的时间是一个浮点的天数,时间是1900-01-01开始到现在的天数

### 解决思路
1. 首先我们需要处理时区的问题,```getTimezoneOffset()```得到距离UTC的分钟时间差
2. 然后将时间转换为毫秒级时间戳,传入```new Date()```中,初始化对象
3. 由于时间戳开始时间是1970-01-01,所以```getFullYear()```要减去70年,得到UTC年份
4. 毫秒转换为时间戳除以1000即可得到,然后对其取整。

### js代码实例

```js
let value = 4564;
value = value + (new Date()).getTimezoneOffset() / 60 / 24;
let date = new Date((value - 1) * 24 * 3600000 + 1);
date.setUTCFullYear(date.getFullYear() - 70);
return parseInt('' + date.getTime() / 1000);
``` 查看全部

### 背景

js从excel中拿到的时间是一个浮点的天数,时间是1900-01-01开始到现在的天数

### 解决思路
1. 首先我们需要处理时区的问题,```getTimezoneOffset()```得到距离UTC的分钟时间差
2. 然后将时间转换为毫秒级时间戳,传入```new Date()```中,初始化对象
3. 由于时间戳开始时间是1970-01-01,所以```getFullYear()```要减去70年,得到UTC年份
4. 毫秒转换为时间戳除以1000即可得到,然后对其取整。

### js代码实例

```js
let value = 4564;
value = value + (new Date()).getTimezoneOffset() / 60 / 24;
let date = new Date((value - 1) * 24 * 3600000 + 1);
date.setUTCFullYear(date.getFullYear() - 70);
return parseInt('' + date.getTime() / 1000);
```

windows PE header数据结构分析

数据结构与算法网站管理员 发表了文章 • 0 个评论 • 61 次浏览 • 2019-06-18 10:44 • 来自相关话题

如何获取PE(Protable Executable)格式的header,PE的结构在winnt.h中可以获得,该头文件里定义了大量的PE数据结构体,方便我们对可执行文件数据结构进行分析。
如果我们不知道这些结构,我们可能需要逆向工程的技术对其结构进行分析猜想,还是包含一定的工作量。

PEheader的定义如下:

WORD的数据类型是short的无符号整型,```e_magic```是DOS签名,```e_lfanew```是NT的偏移量。一般的PE文件e_magic为```0x5a4d```。


### WORD的定义
```
typedef unsigned short WORD;
```

### PE header

```
typedef struct _IMAGE_DOS_HEADER {
WORD e_magic;
WORD e_cblp;
WORD e_cp;
WORD e_crlc;
WORD e_cparhdr;
WORD e_minalloc;
WORD e_maxalloc;
WORD e_ss;
WORD e_sp;
WORD e_csum;
WORD e_ip;
WORD e_cs;
WORD e_lfarlc;
WORD e_ovno;
WORD e_res[4];
WORD e_oemid;
WORD e_oeminfo;
WORD e_res2[10];
LONG e_lfanew;
} IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER;
```

### 示例代码

```c
#include
#include
#include

int main() {
FILE *file;
IMAGE_DOS_HEADER header;
file = fopen("cmake-build-debug\\c_demo.exe", "r");
fread(&header, sizeof(header), 1, file);
fclose(file);

printf("doc: 0x%x\n", header.e_magic);
return 0;
}
``` 查看全部

如何获取PE(Protable Executable)格式的header,PE的结构在winnt.h中可以获得,该头文件里定义了大量的PE数据结构体,方便我们对可执行文件数据结构进行分析。
如果我们不知道这些结构,我们可能需要逆向工程的技术对其结构进行分析猜想,还是包含一定的工作量。

PEheader的定义如下:

WORD的数据类型是short的无符号整型,```e_magic```是DOS签名,```e_lfanew```是NT的偏移量。一般的PE文件e_magic为```0x5a4d```。


### WORD的定义
```
typedef unsigned short WORD;
```

### PE header

```
typedef struct _IMAGE_DOS_HEADER {
WORD e_magic;
WORD e_cblp;
WORD e_cp;
WORD e_crlc;
WORD e_cparhdr;
WORD e_minalloc;
WORD e_maxalloc;
WORD e_ss;
WORD e_sp;
WORD e_csum;
WORD e_ip;
WORD e_cs;
WORD e_lfarlc;
WORD e_ovno;
WORD e_res[4];
WORD e_oemid;
WORD e_oeminfo;
WORD e_res2[10];
LONG e_lfanew;
} IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER;
```

### 示例代码

```c
#include
#include
#include

int main() {
FILE *file;
IMAGE_DOS_HEADER header;
file = fopen("cmake-build-debug\\c_demo.exe", "r");
fread(&header, sizeof(header), 1, file);
fclose(file);

printf("doc: 0x%x\n", header.e_magic);
return 0;
}
```

淘小铺邀请码URLF

PHP网站管理员 发表了文章 • 0 个评论 • 90 次浏览 • 2019-05-22 19:37 • 来自相关话题

今天朋友圈大家都在分享淘小铺,这是阿里巴巴推出的一个分销应用,用来和拼多多抗衡

今天朋友圈大家都在分享淘小铺,这是阿里巴巴推出的一个分销应用,用来和拼多多抗衡

解决Ubuntu下,/usr/bin/pycompile无法找到模块ConfigParser

Python网站管理员 发表了文章 • 0 个评论 • 194 次浏览 • 2019-04-17 14:52 • 来自相关话题

pycompile出现异常,找不到模块ConfigParser,期初以为是自己没有安装,后来用pip安装尝试安装,已经安装了

```
Traceback (most recent call last):
File "/usr/bin/pycompile", line 35, in
from debpython.version import SUPPORTED, debsorted, vrepr, \
File "/usr/share/python/debpython/version.py", line 24, in
from ConfigParser import SafeConfigParser
ImportError: No module named 'ConfigParser'
```

ConfigParser是python2.x的一个参数parse模块,但是python3.x已经是用小写了```configparser```,加上自己的linux环境主要用的是python3.5,所以断定这个pycompile还是用的python2.x

```bash
whereis pycompile
# /usr/bin/pycompile
mv /usr/bin/pycompile /usr/bin/pycompile.backup
ln -s /usr/bin/py3compile /usr/bin/pycompile
```

用命令```whereis```查看了一下pycompile的路径,然后在该目录下找到了3.x版本的,果断备份,添加新的软链。 查看全部


pycompile出现异常,找不到模块ConfigParser,期初以为是自己没有安装,后来用pip安装尝试安装,已经安装了

```
Traceback (most recent call last):
File "/usr/bin/pycompile", line 35, in
from debpython.version import SUPPORTED, debsorted, vrepr, \
File "/usr/share/python/debpython/version.py", line 24, in
from ConfigParser import SafeConfigParser
ImportError: No module named 'ConfigParser'
```

ConfigParser是python2.x的一个参数parse模块,但是python3.x已经是用小写了```configparser```,加上自己的linux环境主要用的是python3.5,所以断定这个pycompile还是用的python2.x

```bash
whereis pycompile
# /usr/bin/pycompile
mv /usr/bin/pycompile /usr/bin/pycompile.backup
ln -s /usr/bin/py3compile /usr/bin/pycompile
```

用命令```whereis```查看了一下pycompile的路径,然后在该目录下找到了3.x版本的,果断备份,添加新的软链。

如何在Python3.x上安装Sentry,实现实时监控业务错误

Python网站管理员 发表了文章 • 0 个评论 • 208 次浏览 • 2019-04-17 14:40 • 来自相关话题

在Python3.x上安装Sentry是不可能的!!!

Sentry是一款收集错误的工具,能够实时展示给开发人员,并且后台界面做的十分的好看,
但是你会发现在Python3.x上安装十分的费劲,最后还是会以失败而告终。

2015年有人在github上提了个issue,问作者在Python3.x上为什么无法安装sentry,作者回答不支持。如果你尝试用pip安装sentry的话,会出现如下错误:

```
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting sentry
Using cached https://pypi.tuna.tsinghua.edu ... ar.gz
Collecting BeautifulSoup>=3.2.1 (from sentry)
Using cached https://pypi.tuna.tsinghua.edu ... ar.gz
Complete output from command python setup.py egg_info:
Traceback (most recent call last):
File "", line 1, in
File "/tmp/pip-install-krx08m8x/BeautifulSoup/setup.py", line 22
print "Unit tests have failed!"
^
SyntaxError: Missing parentheses in call to 'print'

----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-krx08m8x/BeautifulSoup/
```

在该项目的```setup.py```文件中,我们发现该项目用户的框架是```Django```,并且```Programming Language :: Python :: 2 :: Only```,只支持2.x,都9102年了,还在用Python2.x。

```
classifiers=[
'Framework :: Django',
'Intended Audience :: Developers',
'Intended Audience :: System Administrators',
'Operating System :: POSIX :: Linux',
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 2 :: Only',
'Topic :: Software Development'
],
```

### 如何在Python2.x上安装Sentry

网上安装的教程太多了,我就不重复写了,可以pip安装,手动编译源码安装,甚至可以安装docker镜像,十分的方便

#### 推荐安装方法
```
https://www.cnblogs.com/scharf ... .html
``` 查看全部

在Python3.x上安装Sentry是不可能的!!!

Sentry是一款收集错误的工具,能够实时展示给开发人员,并且后台界面做的十分的好看,
但是你会发现在Python3.x上安装十分的费劲,最后还是会以失败而告终。

2015年有人在github上提了个issue,问作者在Python3.x上为什么无法安装sentry,作者回答不支持。如果你尝试用pip安装sentry的话,会出现如下错误:

```
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting sentry
Using cached https://pypi.tuna.tsinghua.edu ... ar.gz
Collecting BeautifulSoup>=3.2.1 (from sentry)
Using cached https://pypi.tuna.tsinghua.edu ... ar.gz
Complete output from command python setup.py egg_info:
Traceback (most recent call last):
File "", line 1, in
File "/tmp/pip-install-krx08m8x/BeautifulSoup/setup.py", line 22
print "Unit tests have failed!"
^
SyntaxError: Missing parentheses in call to 'print'

----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-krx08m8x/BeautifulSoup/
```

在该项目的```setup.py```文件中,我们发现该项目用户的框架是```Django```,并且```Programming Language :: Python :: 2 :: Only```,只支持2.x,都9102年了,还在用Python2.x。

```
classifiers=[
'Framework :: Django',
'Intended Audience :: Developers',
'Intended Audience :: System Administrators',
'Operating System :: POSIX :: Linux',
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 2 :: Only',
'Topic :: Software Development'
],
```

### 如何在Python2.x上安装Sentry

网上安装的教程太多了,我就不重复写了,可以pip安装,手动编译源码安装,甚至可以安装docker镜像,十分的方便

#### 推荐安装方法
```
https://www.cnblogs.com/scharf ... .html
```

Some tips, better use of Vim

Linux网站管理员 发表了文章 • 0 个评论 • 167 次浏览 • 2019-04-17 11:07 • 来自相关话题

### Directory is not exist?

```bash
Command Control + Z, run vim background, and user command mkdir to create this directory
```

### No permission to create this file, or edit it?

```
# ESC
:w !sudo tee % >/dev/null
```

And then, your need to choice ```Ok``` or ```Load```, after your choice, the file mode will be readonly. don't feel fear, your can use command above 查看全部
### Directory is not exist?

```bash
Command Control + Z, run vim background, and user command mkdir to create this directory
```

### No permission to create this file, or edit it?

```
# ESC
:w !sudo tee % >/dev/null
```

And then, your need to choice ```Ok``` or ```Load```, after your choice, the file mode will be readonly. don't feel fear, your can use command above

Windows安装mitmproxy遇到的坑,官方二进制包只包含Python标准库!

Python网站管理员 发表了文章 • 0 个评论 • 291 次浏览 • 2019-04-15 10:52 • 来自相关话题

### 昨天在windows上用pip安装mitmproxy的时候,出现了一个异常的错误
```
Microsoft Visual C++ 14.0 is required
```
如果需要安装```Microsoft Visual C++ 14.0```的编译工具还是挺麻烦,于是想着官方有打包二进制包,直接安装得了,省事儿。出现无法加载第三方库,```No module named``` 结果发现官方编译的二进制不能使用第三方模块,瞬间感觉就不好了。

### github issues

> Addon scripts don't have access to full Python 3 standard library
> issues地址:https://github.com/mitmproxy/mitmproxy/issues/3238

### 作者给出的解释
>Hi,
>
>Our binaries only contain parts of Python’s stdlib to save space. If you need additional modules, you need to install mitmproxy via pip or from source: https://docs.mitmproxy.org/sta ... tion/

作者的意思是:为了节省二进制包的大小,只包含了Python的标准库,如果需要安装mitmproxy的话,建议用pip或者源码编译

### 解决方案

1. 最后还是不得不安装```Microsoft Visual C++ 14.0```,然后pip安装mitmproxy
2. 后台又试了一下,原来是安装不了```brotlipy, bindings to the Brotli compression library.```

打开如下网站,找到相应的python版本,以及系统类型,下载安装即可:
```bash
pip install brotlipy‑0.7.0‑cp37‑cp37m‑win_amd64.whl
```
```
https://www.lfd.uci.edu/~gohlke/pythonlibs/
``` 查看全部
### 昨天在windows上用pip安装mitmproxy的时候,出现了一个异常的错误
```
Microsoft Visual C++ 14.0 is required
```
如果需要安装```Microsoft Visual C++ 14.0```的编译工具还是挺麻烦,于是想着官方有打包二进制包,直接安装得了,省事儿。出现无法加载第三方库,```No module named``` 结果发现官方编译的二进制不能使用第三方模块,瞬间感觉就不好了。

### github issues

> Addon scripts don't have access to full Python 3 standard library
> issues地址:https://github.com/mitmproxy/mitmproxy/issues/3238

### 作者给出的解释
>Hi,
>
>Our binaries only contain parts of Python’s stdlib to save space. If you need additional modules, you need to install mitmproxy via pip or from source: https://docs.mitmproxy.org/sta ... tion/

作者的意思是:为了节省二进制包的大小,只包含了Python的标准库,如果需要安装mitmproxy的话,建议用pip或者源码编译

### 解决方案

1. 最后还是不得不安装```Microsoft Visual C++ 14.0```,然后pip安装mitmproxy
2. 后台又试了一下,原来是安装不了```brotlipy, bindings to the Brotli compression library.```

打开如下网站,找到相应的python版本,以及系统类型,下载安装即可:
```bash
pip install brotlipy‑0.7.0‑cp37‑cp37m‑win_amd64.whl
```
```
https://www.lfd.uci.edu/~gohlke/pythonlibs/
```