分类目录归档:工具

Python 除了 time.sleep,你还有 event.wait 暂停代码的方法

我们知道,在 Python 里面可以使用time.sleep来让代码暂停一段时间,例如:

import time

print('...部分代码...')
time.sleep(5)
print('...剩下的代码...')

程序首先打印出...部分代码...,然后等待5秒钟,再打印出...剩下的代码...

现在大家想一想,有没有什么办法,在不使用time.sleep的情况下,让程序暂停5秒?

你可能会说,用requests访问一个延迟5秒的网址、或者用递归版算法计算斐波那契数列第36位……这些奇技淫巧。

不过今天我说的,是另外一个东西,threading模块里面的Event

我们来看看它的用法:

import threading

event = threading.Event()
print('...部分代码...')
event.wait(5)
print('...剩下的代码...')

这样一来,程序首先打印出...部分代码...,然后等待5秒钟,再打印出...剩下的代码...

功能看起来跟time.sleep没什么区别,那为什么我要特别提到它呢?因为在多线程里面,它比time.sleep更有用。我们来看一个例子:

import threading

class Checker(threading.Thread):
def __init__(self, event):
super().__init__()
self.event = event

def run(self):
while not self.event.is_set():
print('检查 redis 是否有数据')
       time.sleep(60)

trigger_async_task()
event = threading.Event()
checker = Checker(event)
checker.start()
if user_cancel_task():
    event.set()

我来解释一下这段代码的意思。在主线程里面,我调用trigger_async_task()触发了一个异步任务。这个任务多久完成我并不清楚。但是这个任务完成以后,它会往 Redis 里面发送一条消息,只要 Redis 有这个消息了,我就知道它完成了。所以我要创建一个 checker 子线程,每60秒去 Redis里面检查任务是否完成。如果没有完成,就暂停60秒,然后再检查。

但某些情况下,我不需要等待了,例如用户主动取消了任务。这个时候,我就想提前结束这个 checker 子线程。

但是我们知道,线程是不能从外面主动杀死的,只能让它自己退出。所以当我执行event.set()后,子线程里面self.event.is_set()就会返回 False,于是这个循环就不会继续执行了。

可是,如果某一轮循环刚刚开始,我在主线程里面调用了event.set()。此时,子线程还在time.sleep中,那么子线程需要等待60秒才会退出。

但如果我修改一下代码,使用self.event.wait(60)

import threading

class Checker(threading.Thread):
def __init__(self, event):
        super().__init__()
        self.event = event

def run(self):
while not self.event.is_set():
            print('检查 redis 是否有数据')
            self.event.wait(60)

trigger_task()
event = threading.Event()
checker = Checker(event)
checker.start()
if user_cancel_task():
    event.set()

那么,即便self.event.wait(60)刚刚开始阻塞,只要我在主线程中执行了event.set(),子线程里面的阻塞立刻就会结束。于是子线程立刻就会结束。不需要再白白等待60秒。

并且,event.wait()这个函数在底层是使用 C 语言实现的,不受 GIL 锁的干扰。

本文转自AirPython.

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

利用 Python pyttsx3 将 PDF 文档转为语音音频

 

 

 

 

 

 

 

 

1. 转语音工具

微信读书里的电子书有配套的自动音频,而且声音优化的不错,比传统的机械朗读听起来舒服很多

记得之前看到过 Python有一个工具包,可以将文字转换为语音,支持英文和中文的同时,还能调节语速语调、导出 mp3 等音频文件

去 Github 查了下,这个依赖库叫:pyttsx3

简单来说,pyttsx3 可以文字转语音,且是离线工作的,这一点就很实用

安装比较容易,直接在命令行用 pip 安装:

pip install pyttsx3

我准备动手试试,将 PDF 书籍转成音频

用什么书呢?最近在群里看到有人发张磊的新作《价值》电子书,这本今年刚出的畅销书盗版猖獗,我之前在微信读书里看过,对作者长期主义的观点深信不疑

那就它了

2. PDF转文本

肯定需要先读取 PDF 中的文字,再利用 pyttsx3 转语音

Python 中操作 PDF 的工具库主要是 PyPDF2,但发现编码实在有点繁琐

我就换了另一个库 pdfplumber,它与 PyPDF2 语法类似,用起来还算流畅

pdfplumber 可以处理 PDF 包括文本、表格、格式在内的各种信息,小而强大

# 读取PDF文档
pdf = pdfplumber.open("价值.pdf")

# 获取页数
print("总页数:",len(pdf.pages))
print("-----------------------------------------")

# 读取第4页
first_page = pdf.pages[3]
print("本页:",first_page.page_number+1)
print("-----------------------------------------")

# 导出第4页文本
text = first_page.extract_text()
print(text)

输出文字内容如下:

上面的代码做了几件事情:「读取 PDF 文档、读取页数、读取第 4 页、输出第 4 页文本」

3. 文本转语音

接下来开始将第 4 页的文本转化为音频

import pyttsx3

# 初始化来获取语音引擎
engine = pyttsx3.init()

# 去掉文本中的换行符
text = text.replace('\n','')

# 朗读文本
engine.say(text)
engine.runAndWait()

上面代码使用 pyttsx3 将文本转化为音频,然后朗读出来

我是在 jupyter notebook 上做实验的,代码执行后,电脑会直接朗读

最后,将生成的音频保存为 mp3 格式

# 保存音频到本地,格式为mp3
engine.save_to_file(text, 'test.mp3')
engine.runAndWait()

当然,你还可以调整声音的类型、速度、大小

# 调整人声类型
voices = engine.getProperty('voices')  
engine.setProperty('voice', voices[0].id)

# 调整语速,范围一般在0~500之间
rate = engine.getProperty('rate')                         
engine.setProperty('rate'200)     

# 调整声量,范围在0~1之间
volume = engine.getProperty('volume')                         
engine.setProperty('volume',0.8

最后听下生成的语音是什么样的?

test.mp3 来自AirPython 01:58

整体比较流畅,虽然不如微信读书语音听着那般舒服,但做做小工具还是不错的

转自AirPython.

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

Loguru — 最强大的 Python 日志记录器

Loguru 一个能彻底解放你的日志记录器。

它即插即用,具备多种方式滚动日志、自动压缩日志文件、定时删除等功能。

除此之外,多线程安全、高亮日志、日志告警等功能也不在话下。

下面就给大家介绍一下这个强大工具的基本使用方法。

Loguru 安装方式很简单,打开终端输入:

pip install loguru

即可完成安装。

1.即开即用

如果你需要输出 debug 日志到终端,可以这么做:

from loguru import logger

logger.debug("That's it, beautiful and simple logging!")

其输出自带高亮:

如果你需要把日志输出到文件,只需要这样:

from loguru import logger
logger.add("file_{time}.log")
logger.debug("That's it, beautiful and simple logging!")

这样就会在当前运行的文件夹下生成 file_当前时间.log 的日志文件:

2.滚动日志与压缩

使用 Loguru 我们可轻易地实现滚动日志。

按时间滚动

比如按时间滚动,我们只需要在 logger.add 参数中添加一个 rotation 参数:

from loguru import logger
logger.add("file_2.log", rotation="12:00")     # 每天12:00会创建一个新的文件
logger.debug("That's it, beautiful and simple logging!")

这样,如果当前时间过了这个设定的时间,它就会生成一个新的日志文件。如果没有则使用原来的日志文件:

如图所示,过了设定的时间,则将原来的 file_2.log 重命名,并添加一个新的 file_2.log 文件。

按大小滚动

除了按时间滚动日志外,Loguru 还可以按日志大小滚动:

from loguru import logger
logger.add("file_1.log", rotation="1 MB")    # 滚动大日志文件
logger.debug("That's it, beautiful and simple logging!")

这样,一旦日志文件大小超过 1 MB 就会产生新的日志文件。

压缩日志

如果你不想删除原有日志文件,Loguru 还支持将日志直接压缩:

from loguru import logger
logger.add("file_Y.log", compression="zip")    # 压缩日志

3.其他特性

自定义颜色

Loguru 是支持自定义颜色的,如果你不喜欢它默认的颜色,可以这么改:

logger.add(sys.stdout, colorize=True, format="<green>{time}</green> <level>{message}</level>")

类似于HTML标签 <green></green> 标签中间的文字将会被标记为绿色。

多进程安全

Loguru 默认情况下是线程安全的,但它不是多进程安全的。不过如果你需要多进程/异步记录日志,它也能支持,只需要添加一个 enqueue 参数:

logger.add("somefile.log", enqueue=True)

支持Backtrace

对于日志而言,没有错误堆栈的日志是没有灵魂的。Loguru 允许显示整个堆栈信息来帮助你发现问题(包括变量)。

比如下面这个例子:

logger.add("out.log", backtrace=True, diagnose=True)  # Caution, may leak sensitive data in prod

def func(a, b):
    return a / b

def nested(c):
    try:
        func(5, c)
    except ZeroDivisionError:
        logger.exception("What?!")

nested(0)

日志将会是这样的:

非常清晰明了。

邮件告警

Loguru 可以和强大的邮件通知模块 notifiers 库结合使用,以在程序意外失败时接收电子邮件,或发送许多其他类型的通知。

import notifiers

params = {
    "username": "you@gmail.com",
    "password": "abc123",
    "to": "dest@gmail.com"
}

# 初始化时发送一封邮件
notifier = notifiers.get_notifier("gmail")
notifier.notify(message="The application is running!", **params)

# 发生Error日志时,发邮件进行警报
from notifiers.logging import NotificationHandler

handler = NotificationHandler("gmail", defaults=params)
logger.add(handler, level="ERROR")

这样配置之后,每次产生 Error 日志,程序都会自动向你的邮箱发送告警,真的极其方便。

除了这些特性外,Loguru 还支持与 Python 原生的 Logging 模块兼容使用,你可以将原始的标准日志记录器记录的所有信息转移到Loguru中。

你还可以基于 Loguru 定制新的日志 Level,定制自己喜欢的结构化数据,详情可见 Loguru 的官方文档:

https://github.com/Delgan/loguru

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 教程 — 将微信头像秒变成表情包

在日常生活中,我们经常会存取一些朋友们的丑照,在这个项目中,我们以萌萌哒的熊猫头作为背景,然后试着在背景图上加入朋友们的照片。效果如下图所示:

二、实现步骤

  1. 导入朋友的照片(前景照片);

  2. 处理前景照片(缩放、旋转,填充);

  3. 导入熊猫头照片(背景照片);

  4. 将前景和背景拼接起来形成表情包;

  5. 在表情包下面添加文字。

三、Python 实现

1、导入需要的库

import cv2
import numpy as mp
import matplotlib.pyplot as plt
from PIL import Image, ImageDraw, ImageFont

这个项目主要是通过 opencv 完成,但如果要在表情包下面写中文的话,PIL(pillow)库是必不可少的。

2、绘图函数

这里写一个绘图函数,方便绘图操作。

def plt_show(img):
    imageRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    plt.imshow(imageRGB)
    plt.show()

3、导入前景照片

image = cv2.imread('SXC.jpg', 0)  # 导入灰度图即可
plt_show(image)

4、等比例缩放前景照片

因为我们发现前景照片的尺寸比背景尺寸还要大,这显然是不合适的,所以要先对其进行等比例(0.3)缩放。

image_resize = cv2.resize(image, None, fx=0.3, fy=0.3, interpolation = cv2.INTER_CUBIC)
plt_show(image_resize)

5、对前景照片进行二值化处理

在这里,我们将像素值大于 80 的区域设置为 255;小于 80 的区域设置成 0。

ret, image_binary = cv2.threshold(image_resize, 80, 255, cv2.THRESH_BINARY)
plt_show(image_binary)

6、提取出感兴趣区域

image_roi = image_binary[74: 185, 0: 150]
plt_show(image_roi)

7、旋转图片

因为我们的背景图片(熊猫头)是正的,而前景图片有些向右倾斜,所以要先对其进行旋转操作(大概逆时针旋转 15 度即可)。

rows, cols = image_roi.shape
M = cv2.getRotationMatrix2D(((cols-1)/2.0, (rows-1)/2.0), 15, 1)  # (旋转中心,逆时针旋转角度,各个方向同等扩大比例)
image_rotate = cv2.warpAffine(image_roi, M, (140, 130))  # (140, 130) 是指旋转后的画布大小
plt_show(image_rotate)

8、将一些不需要的黑色区域删除掉

在这里我们使用 cv2.fillPoly 函数对不需要的区域用白色进行填充。

h, w = image_rotate.shape

image_rotate_copy = image_rotate.copy()
pts1 = np.array([[0, 20],  [64, 0], [0, 0]], np.int32)
pts2 = np.array([[0, 18],  [0, h], [80, h]], np.int32)
pts3 = np.array([[0, 100],  [0, h], [w, h], [w, 100]], np.int32)
pts4 = np.array([[111, 0],  [w, 0], [w, 30]], np.int32)
pts5 = np.array([[124, 0],  [115, h], [w, h]], np.int32)
pts6 = np.array([[120, 40],  [95, 100], [120, 100]], np.int32)
foreground = cv2.fillPoly(image_rotate_copy, [pts1], (255, 255, 255))  # (图片,填充区域,填充颜色)
foreground = cv2.fillPoly(image_rotate_copy, [pts2], (255, 255, 255))
foreground = cv2.fillPoly(image_rotate_copy, [pts3], (255, 255, 255))
foreground = cv2.fillPoly(image_rotate_copy, [pts4], (255, 255, 255))
foreground = cv2.fillPoly(image_rotate_copy, [pts5], (255, 255, 255))
foreground = cv2.fillPoly(image_rotate_copy, [pts6], (255, 255, 255))

plt_show(foreground)

9、再次提取感兴趣区域并缩放

foreground_roi = foreground[0: 93, 0: 125]
plt_show(foreground_roi)

foreground_roi_resize = cv2.resize(foreground_roi, None, fx=2.5, fy=2.5, interpolation = cv2.INTER_CUBIC)
plt_show(foreground_roi_resize)

10、导入背景图片

background = cv2.imread('back.jpg', 0)
plt_show(background)

11、组合两张图片成表情包

h_f, w_f = foreground.shape
h_b, w_b = background.shape

left = (w_b - w_f)//2  # 前景图片在背景图片中的左边的横坐标
right = left + w_f  # 前景图片在背景图片中的右边的横坐标
top = 100  # 前景图片在背景图片中的上边的纵坐标
bottom = top + h_f  # 前景图片在背景图片中的下边的纵坐标

emoji = background
emoji[top: bottom, left: right] = foreground
plt_show(emoji)

12、在表情包下面添加文本

12.1 添加英文文本

如果只是要添加英文文本,用 opencv 就可以解决:

emoji_copy = emoji.copy()
# (图片,文本,位置,字体,文本大小,文本颜色,文本粗细)
cv2.putText(emoji_copy, "FXXK!!", (210, 500), cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 0, 0), 5)
plt_show(emoji_copy)

12.2 添加中文文本

如果要添加中文文本,我们需要借助 PIL 库来实现。

PilImg = Image.fromarray(emoji)  # cv2 转 PIL
draw = ImageDraw.Draw(PilImg)  # 创建画笔
ttfront = ImageFont.truetype('simhei.ttf', 34)  # 设置字体
draw.text((210, 450),"你瞅啥!!",fill=0, font=ttfront)  # (位置,文本,文本颜色,字体)
emoji_text = cv2.cvtColor(np.array(PilImg),cv2.COLOR_RGB2BGR)  # PIL 转回 cv2
plt_show(emoji_text)

13、保存表情包

cv2.imwrite('./emoji.png', np.array(emoji_text))

四、完整代码

import cv2
import numpy as mp
import matplotlib.pyplot as plt
from PIL import Image, ImageDraw, ImageFont

def plt_show(img):
    imageRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    plt.imshow(imageRGB)
    plt.show()

image = cv2.imread('SXC.jpg', 0)  # 导入前景图片

image_resize = cv2.resize(image, None, fx=0.3, fy=0.3, interpolation = cv2.INTER_CUBIC)  # 缩放

ret, image_binary = cv2.threshold(image_resize, 80, 255, cv2.THRESH_BINARY)  # 图片二值化

image_roi = image_binary[74: 185, 0: 150]  # 感兴趣区域

rows, cols = image_roi.shape
# 旋转
M = cv2.getRotationMatrix2D(((cols-1)/2.0, (rows-1)/2.0), 15, 1)
image_rotate = cv2.warpAffine(image_roi, M, (140, 130))
# 填充不需要的区域
h, w = image_rotate.shape
image_rotate_copy = image_rotate.copy()
pts1 = np.array([[0, 20],  [64, 0], [0, 0]], np.int32)
pts2 = np.array([[0, 18],  [0, h], [80, h]], np.int32)
pts3 = np.array([[0, 100],  [0, h], [w, h], [w, 100]], np.int32)
pts4 = np.array([[111, 0],  [w, 0], [w, 30]], np.int32)
pts5 = np.array([[124, 0],  [115, h], [w, h]], np.int32)
pts6 = np.array([[120, 40],  [95, 100], [120, 100]], np.int32)
foreground = cv2.fillPoly(image_rotate_copy, [pts1], (255, 255, 255))
foreground = cv2.fillPoly(image_rotate_copy, [pts2], (255, 255, 255))
foreground = cv2.fillPoly(image_rotate_copy, [pts3], (255, 255, 255))
foreground = cv2.fillPoly(image_rotate_copy, [pts4], (255, 255, 255))
foreground = cv2.fillPoly(image_rotate_copy, [pts5], (255, 255, 255))
foreground = cv2.fillPoly(image_rotate_copy, [pts6], (255, 255, 255))

foreground_roi = foreground[0: 93, 0: 125]
foreground_roi_resize = cv2.resize(foreground_roi, None, fx=2.5, fy=2.5, interpolation = cv2.INTER_CUBIC)

background = cv2.imread('back.jpg', 0)  # 导入背景图片
# 拼接两张图片
h_f, w_f = foreground_roi_resize.shape
h_b, w_b = background.shape
left = (w_b - w_f)//2
right = left + w_f
top = 80
bottom = top + h_f
emoji = background
emoji[top: bottom, left: right] = foreground_roi_resize

PilImg = Image.fromarray(emoji)  # cv2 转 PIL
draw = ImageDraw.Draw(PilImg)  # 创建画笔
ttfront = ImageFont.truetype('simhei.ttf', 34)  # 设置字体
draw.text((210, 450),"你瞅啥!!",fill=0, font=ttfront)  # (位置,文本,文本颜色,字体)
emoji_text = cv2.cvtColor(np.array(PilImg),cv2.COLOR_RGB2BGR)  # PIL 转回 cv2

cv2.imwrite('./emoji.png', np.array(emoji_text))  # 保存表情包

原文链接:https://urlify.cn/2aQfya

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

超简单一键美化你的文章—使其更具可读性

在平时写文章的时候,我都会注意在中文和英文单词之间保留一个空格的习惯,这样能使文本具有良好的可读性。

但是我经常忽略某些半角字符(数字和符号)与中文之间的空格,导致可读性比较差,在阅读别人的文章或者修改别人的文章时候,也经常为烦恼他人没有这种优化可读性的细节。

现在,有一个很棒的工具,叫做 pangu , 它可以在中文、日文、韩文和半角字符(字母,数字和符号)之间自动插入空格。

有了它,你可以在每次写完文章后利用 pangu 一键美化文章。也可以用 pangu 美化别人的文章:

import pangu

new_text = pangu.spacing_text('你可以在每次写完文章后利用pangu一键美化文章。也可以用pangu 美化别人的文章:')
print(new_text)
# new_text = '你可以在每次写完文章后利用 pangu 一键美化文章。也可以用 pangu 美化别人的文章:'

如上所示,非常方便。当然你也可以自己用正则表达式去匹配并美化,但是用起来肯定没有 pangu 方便。

下面教大家 pangu 模块的使用方法:

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

pip install -U pangu

2.使用

安装完成之后,你可以尝试写一些简单的句子并美化它们:

import pangu

new_text = pangu.spacing_text('Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal)')
print(new_text)
# new_text = 'Windows 环境下打开 Cmd (开始 — 运行 —CMD),苹果系统环境下请打开 Terminal (command + 空格输入 Terminal)'

一键执行

你也可以不写 python 文件,直接通过 -m 参数执行命令:

python -m pangu "為什麼小明有問題都不Google?因為他有Bing"
# 為什麼小明有問題都不 Google?因為他有 Bing

此外,pangu 也支持 pangu 命令直接格式化文本:

pangu "請使用uname -m指令來檢查你的Linux作業系統是32位元或是[敏感词已被屏蔽]位元"
# 請使用 uname -m 指令來檢查你的 Linux 作業系統是 32 位元或是 [敏感词已被屏蔽] 位元

文件支持

通过 -f 参数,pangu 支持把指定的文件内容进行美化,然后输出到另一个文件中:

echo "未來的某一天,Gmail配備的AI可能會得出一個結論:想要消滅垃圾郵件最好的辦法就是消滅人類" >> path/to/file.txt
pangu -f path/to/file.txt >> pangu_file.txt
cat pangu_file.txt
# 未來的某一天,Gmail 配備的 AI 可能會得出一個結論:想要消滅垃圾郵件最好的辦法就是消滅人類

管道支持 (UNIX)

在 UNIX 系统中,比如 Linux 和 MacOS,pangu还支持使用管道 ( | ) 命令美化文本:

echo "心裡想的是Microservice,手裡做的是Distributed Monolith" | pangu
# 心裡想的是 Microservice,手裡做的是 Distributed Monolith

echo "你從什麼時候開始產生了我沒使用Monkey Patch的錯覺?" | python -m pangu
# 你從什麼時候開始產生了我沒使用 Monkey Patch 的錯覺?

两句命令的效果一样,如果你无法直接使用 pangu 命令,可以尝试 python -m pangu,他们能达到一样的效果。

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

PySnooper – 永远不要使用print进行调试

PySnooper 是一个非常方便的调试器。如果您正在试图弄清楚为什么您的Python代码没有按照您的预期去做,您会希望使用具有断点和监视功能的成熟Debug工具,但是许多Debug工具配置起来非常麻烦。

现在,有了PySnooper,您并不需要配置那么复杂的Debug工具,就能够完成对整个代码的分析。它能告诉您哪些代码正在运行,以及局部变量的值是什么。

其实,PySnooper就是替代了一行一行print的重复性工作,给你的代码一个pysnooper装饰器,它能自动识别到语句和变量并将其值print出来:

import pysnooper

@pysnooper.snoop()
def number_to_bits(number):
    if number:
        bits = []
        while number:
            number, remainder = divmod(number, 2)
            bits.insert(0, remainder)
        return bits
    else:
        return [0]

number_to_bits(6)

效果如下:

Source path:... 1.py
Starting var:.. number = 6
23:03:35.990701 call         4 def number_to_bits(number):
23:03:35.991699 line         5     if number:
23:03:35.991699 line         6         bits = []
New var:....... bits = []
23:03:35.991699 line         7         while number:
23:03:35.991699 line         8             number, remainder = divmod(number, 2)
Modified var:.. number = 3
New var:....... remainder = 0
23:03:35.991699 line         9             bits.insert(0, remainder)
Modified var:.. bits = [0]
23:03:36.004664 line         7         while number:
23:03:36.005661 line         8             number, remainder = divmod(number, 2)
Modified var:.. number = 1
Modified var:.. remainder = 1
23:03:36.005661 line         9             bits.insert(0, remainder)
Modified var:.. bits = [1, 0]
23:03:36.007657 line         7         while number:
23:03:36.007657 line         8             number, remainder = divmod(number, 2)
Modified var:.. number = 0
23:03:36.008655 line         9             bits.insert(0, remainder)
Modified var:.. bits = [1, 1, 0]
23:03:36.008655 line         7         while number:
23:03:36.009651 line        10         return bits
23:03:36.009651 return      10         return bits
Return value:.. [1, 1, 0]
Elapsed time: 00:00:00.020945

可以看到,它将每一行变量的值都输出到屏幕上,方便你调试代码。

仅仅需要写一行代码—使用装饰器就可以实现这个方便的调试功能,比起一行行写print,这可方便多了。

0.安装

使用这个模块,你只需要使用Pip安装PySnooper:

pip install pysnooper

接下来讲讲这个模块其他好用的功能:

1.支持日志文件

如果你觉得print到屏幕上不方便,还可以将其输出到log文件中,你只需要将装饰器那一行改为:

@pysnooper.snoop('/my/log/file.log')

2.读取局外变量或其他表达式

如果你想读取在装饰器作用范围以外的变量或者表达式的值,还可以使用watch参数:

@pysnooper.snoop(watch=('foo.bar', 'self.x["whatever"]'))

3.如果你不想用装饰器,也可以用上下文的形式调试

没错,装饰器有限定的使用条件,使用起来比较局限,因此pysnooper还支持使用 with 的上下文形式:

import pysnooper
import random

def foo():
    lst = []
    for i in range(10):
        lst.append(random.randrange(1, 1000))

    with pysnooper.snoop():
        lower = min(lst)
        upper = max(lst)
        mid = (lower + upper) / 2
        print(lower, mid, upper)

foo()

效果如下,只有上下文里的代码才会被调试出来:

New var:....... i = 9
New var:....... lst = [681, 267, 74, 832, 284, 678, ...]
09:37:35.881721 line        10         lower = min(lst)
New var:....... lower = 74
09:37:35.882137 line        11         upper = max(lst)
New var:....... upper = 832
09:37:35.882304 line        12         mid = (lower + upper) / 2
74 453.0 832
New var:....... mid = 453.0
09:37:35.882486 line        13         print(lower, mid, upper)
Elapsed time: 00:00:00.000344

当我们只需要调试部分代码的时候,这个上下文形式的调试方法非常方便。

此外,PySnooper还有许多更强大的用法,大家可以看他们的高级使用文档:

https://github.com/cool-RR/PySnooper/blob/master/ADVANCED_USAGE.md

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

漂亮的GitHub个人总览 ,原来这么容易实现

前段时间,GitHub悄悄地发布了一个新功能:Profile README.

翻译成中文即简历型README,好听一点就是个人自述型简历,简单点就是个人GitHub总览

下面给大家讲讲怎么通过 GitHub API 创建一个能够自更新的总览。

1.首先,创建一个GitHub仓库:

创建一个与你的GitHub帐户同名的存储库(在我的情况下为github.com/Ckend/Ckend

向其添加一个README.md,我写入了以下内容:

“To be continued…”

如图所示:

然后GitHub将在你的个人资料页面顶部呈现该README内容,对我来说就是github.com/Ckend

如图所示,你用户名的这个仓库的 README.md 将成为你的个人资料首页的展示内容。

2.美化你的展示内容

首先,我们可以加一个GitHub的基本统计信息

这是官方给出的统计组件API,使用起来很方便,你只需要往你的README.md里添加下述代码即可:

<img align="left" src="https://github-readme-stats.vercel.app/api?username=你的账号用户名&include_all_commits=true&count_private-true&custom_title=你的账号用户名'%20GitHub%20Stats&line_height=30&show_icons=true&hide_border=true&bg_color=192133&title_color=efb752&icon_color=efb752&text_color=70bed9">

此外GitHub官方还提供了一个展示自己最常用语言的接口。

你可以在README.md里添加下述内容展示这个图表:

<img align="right" src="https://github-readme-stats.vercel.app/api/top-langs/?username=ckend">

你还可以带一个 &layout=compact 参数展示横版图表:

<img align="right" src="https://github-readme-stats.vercel.app/api/top-langs/?username=ckend&layout=compact">

另外,​我们还可以加上技术栈图标:

利用 https://img.shields.io 提供的图标,可以轻松实现这点,在README键入以下内容即可:

### 技术栈

![Python](https://img.shields.io/badge/-Python-192133?style=flat-square&logo=python&logoColor=white)
![Django](https://img.shields.io/badge/-Django-192133?style=flat-square&logo=figma&logoColor=white)
![PHP](https://img.shields.io/badge/-PHP-192133?style=flat-square&logo=figma&logoColor=white)
![MySQL](https://img.shields.io/badge/-MySQL-192133?style=flat-square&logo=mysql&logoColor=white)
![Redis](https://img.shields.io/badge/-Redis-192133?style=flat-square&logo=redis&logoColor=white)
![Elasticsearch](https://img.shields.io/badge/-Elasticsearch-192133?style=flat-square&logo=elasticsearch&logoColor=white)
![Kafka](https://img.shields.io/badge/-Kafka-192133?style=flat-square&logo=apache-kafka&logoColor=white)

当然,你要根据自己的情况做修改。

此外,shields网站还能自定义图标,可以用于展示自己的项目:

### 项目
[![pythondict-quant](https://img.shields.io/badge/pythondict-quant-192133?style=flat-square)](https://github.com/Ckend/pythondict-quant)
[![scihub-cn](https://img.shields.io/badge/scihub-cn-192133?style=flat-square)](https://github.com/Ckend/scihub-cn)

你可以按照自己的情况选择以上任意一种组件来美化总览。

完成一个漂亮的总览,能让你更有动力去维护GitHub仓库,所以一定要动手试试。

下面给大家提供一份我的总览完整版:

<img align="left" src="https://github-readme-stats.vercel.app/api?username=Ckend&include_all_commits=true&count_private-true&custom_title=Ckend'%20GitHub%20Stats&line_height=30&show_icons=true&hide_border=true&bg_color=192133&title_color=efb752&icon_color=efb752&text_color=70bed9">

### 技术栈
​
![Python](https://img.shields.io/badge/-Python-192133?style=flat-square&logo=python&logoColor=white)
![Django](https://img.shields.io/badge/-Django-192133?style=flat-square&logo=figma&logoColor=white)
![PHP](https://img.shields.io/badge/-PHP-192133?style=flat-square&logo=figma&logoColor=white)
![MySQL](https://img.shields.io/badge/-MySQL-192133?style=flat-square&logo=mysql&logoColor=white)
![Redis](https://img.shields.io/badge/-Redis-192133?style=flat-square&logo=redis&logoColor=white)
![Elasticsearch](https://img.shields.io/badge/-Elasticsearch-192133?style=flat-square&logo=elasticsearch&logoColor=white)
![Kafka](https://img.shields.io/badge/-Kafka-192133?style=flat-square&logo=apache-kafka&logoColor=white)

### 项目
[![pythondict-quant](https://img.shields.io/badge/pythondict-quant-192133?style=flat-square)](https://github.com/Ckend/pythondict-quant)
[![scihub-cn](https://img.shields.io/badge/scihub-cn-192133?style=flat-square)](https://github.com/Ckend/scihub-cn)

大家可以参考这个方案进行修改,绘制一个属于自己的漂亮总览。

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

Jrnl — Python编写的超方便命令行笔记程序

Jrnl 是用Python编写的命令行笔记应用程序,用起来非常简单方便,特别适合需要快速记录文本信息的同学。

您可以使用它轻松创建,搜索和查看所有的笔记。笔记以人类可读的纯文本存储,当然也可以使用 AES加密进行加密

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

pip install jrnl

2.快速上手

要创建一个新的笔记,你只需要在终端这样输入:

jrnl now: 第一次使用. 我擦,这玩意儿真的好用吗?                                              

jrnl 是笔记开始的标志。now: 的标记会记录一个当前时间的时间戳,后接的第一句话到句号(.)为止是笔记的标题。句号后续的所有内容都是该笔记的内容。

第一次使用的时候,会让你指定笔记记录的位置和是否需要加密:

Path to your journal file (leave blank for C:\Users\83493\.local\share\jrnl\journal.txt):
Do you want to encrypt your journal? You can always change this later [y/N] n

一般默认即可,除非你需要做特殊的处理。

如果要查看刚刚编写的记录,可以这样查看到今日为止的所有笔记:

jrnl -to today

结果如下:

或者:

jrnl -n 1

-n 后接的是数字,能够查看最近n条笔记,比如最近一条笔记:

不错,要记点简单的东西的时候甚至不需要开文档编辑器,直接终端用jrnl记录即可。

下面是更多功能的说明。

3.基本使用

如果你在输入 jrnl 命令时后面不接时间,jrnl 会默认使用当前时间插入到笔记中。

不过有时候我们想记的笔记或者日记是多日之前甚至是几个月之前的,这时候jrnl也提供了许多强大的时间格式:

3.1 笔记的时间

jrnl 支持的时间格式如下:

  • at 6am
  • yesterday
  • last monday
  • sunday at noon
  • 2 march 2012
  • 7 apr
  • 5/20/1998 at 23:42
  • 2020-05-22T15:55-04:00

比如:

jrnl 2021-02-01: 2月初. 2月的第一天,祝大家2月万事如意,快快乐乐。

然后查看到今日为止的所有笔记如下:

PS G:\push> jrnl -to today
2021-02-01 09:00 Called in sick.
| Used the time to clean and spent 4h on writing my book.

2021-02-01 09:00 2月初. 
| 2月的第一天,祝大家2月万事如意,快快乐乐。

2021-02-02 00:21 第一次使用.
| 我擦,这玩意儿真的好用吗?

当然,不使用冒号也是可以记笔记的:

PS G:\push> jrnl 不用冒号也能记笔记吗?
[Entry added to default journal]

3.2 标签功能

jrnl 支持标签功能。默认标记符号为@(不用#号是因为它是保留字符)。

要使用标签,请在所需标记的文字前面加上@符号:

jrnl Had a wonderful day at the @beach with @Tom and @Anna.

尽管可以在标记条目时使用大写字母,但按标记搜索时不区分大小写。

条目中可以使用多个标签没有限制。

3.3 重点笔记

要将笔记标记为重点项,只需使用星号(*)对它进行“星标” :

jrnl last sunday *: Best day of my life.

如果你不想添加日期,则以下选项是等效的(确保*号后面没有空格):

jrnl *: Best day of my life.
jrnl *Best day of my life.
jrnl Best day of my life.*

3.4 查看和搜索

要查看到今天为止的所有条目,请输入:

jrnl -to today

jrnl提供了几个过滤命令,以单破折号(-)开头,可让您更方便地进行查找。例如 -n:

jrnl -n 10

列出最近的十个条目。更简洁的写法是 jrnl -10,这两者效果一致。

如果要查看从去年年初到今年三月底之前编写的所有条目,请输入

jrnl -from "last year" -to march

使用多个单词的过滤条件需要使用引号("")括起来。

要查看特定日期的条目,请使用-on

jrnl -on yesterday

-contains 命令显示包含该关键词的所有笔记,–edit 允许你编辑这些笔记。

jrnl -contains "dogs" --edit

不过编辑笔记之前,jrnl会提示你配置一个默认的编辑器(因为编辑功能需要打开编辑器):

按标签过滤

您可以按标签过滤笔记。例如:

jrnl @pinkie @WorldDomination

显示@pinkie@WorldDomination 的所有笔记。标签过滤器可以与其他过滤器结合使用:

jrnl -n 5 @pinkie -and @WorldDomination

显示包含  @pinkie 和 @worldDomination 的最近五个笔记。

要查看笔记中所有的标签,请输入:

jrnl --tags

查看所有重点笔记:

jrnl -starred

3.5 删除笔记

删除笔记非常简单,相当于搜索后加 –delete 参数进行删除。

PS G:\push> jrnl -contains "2月" --delete
Delete entry '2021-02-01 09:00 2月初.2月的第一天,祝大家2月万事如意,快快乐乐。'? [y/N] y

基本的使用就是这些,jrnl 还有一些高级用法,大家可以在官网参考使用:
https://jrnl.sh/en/stable/advanced/

综上所述,如果你有快速记录文本信息的需求,这个工具是你的不二之选。​

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

Easyocr — 3行代码识别图片中的任意语言文字

今天给大家介绍一个超级简单且强大的OCR文本识别工具:easyocr.

这个模块支持70多种语言的即用型OCR,包括中文,日文,韩文和泰文等。

下面是使用这个模块的实战教程。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

pip install easyocr

它会安装除了模型文件之外的所有依赖,模型文件则会在运行代码的时候下载。

对于Windows,如果在安装Torch或Torchvision时报错了,请先按照https://pytorch.org的官方说明安装Torch和Torchvision 。

在pytorch网站上,请确保选择正确的CUDA版本。如果仅打算在CPU模式下运行,请选择CUDA = None。

2.实战教程

这个模块用起来真的非常简单,三行代码完事了:

import easyocr
reader = easyocr.Reader(['ch_sim','en'])
result = reader.readtext('test.png')

运行的过程中会安装所需要的模型文件,像下面这样:

不过它的下载速度非常慢,而且经常会失败,因此这里给出第二个解决方案:先下载好模型文件,再将其放置到所需要的位置:

如果下载速度太慢,请在Python实用宝典公众号后台回复:easyocr, 下载我上传到微云网盘的文字检测模型(CRAFT)和中文简体模型文件包。

下载完模型后,将文件放到下面这个位置。

Windows:C:\Users\用户名.EasyOCR\model
Linux:~/ .EasyOCR / model

重新执行脚本不会再提醒下载模型了:

import easyocr
reader = easyocr.Reader(['ch_sim'])
result = reader.readtext('test.png')
print(result)

我随便截了一个直播弹幕的图片保存在脚本所在的文件夹下,命名为test.png:

结果如下:

基本上所有应该识别的文字都识别出来了,效果非常不错。

另外也可以看到,输出采用列表格式,每个item分别表示对应文字的边界框,识别文本结果和置信度。

这个模块还能识别多语种的情况:

我将这张图片命名为test2.jpg,修改代码中对应的图片名称:

import easyocr
reader = easyocr.Reader(['ch_sim','en'])
result = reader.readtext('test2.jpg')
print(result)

效果如下:

这张图片很复杂,而且是中英文混杂在一起的情况,但是可以看到模型除了左上角的水印,图片中的文字基本都是识别出来了,尽管有部分文字识别错误,但还在可以接受的范围之内。

不过需要注意的是,虽然可以一次性识别许多种语言,但并非所有语言都可以一起用,通常是公共语言和一个特殊语种可以一起识别,相互兼容,比如英语和日语。

如果你的电脑没有GPU或者显存不足,可以加一个gpu=false的参数仅使用CPU运行:

reader = easyocr.Reader(['ch_sim','en'], gpu = False)

另外,这个模块还支持直接使用命令行运行,相当方便,大家可以试一试:

easyocr -l ch_sim en -f test.png --detail=1 --gpu=True

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

一行代码将任何Python 程序转换为图形界面(GUI)应用程序

Gooey项目支持用一行代码将(几乎)任何Python 2或3控制台程序转换为GUI应用程序。

1.快速开始

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

安装说明

(方式一)安装Gooey的最简单方法是通过 pip

pip install Gooey 

(方式二)或者,您可以通过将项目克隆到本地目录来安装Gooey

git clone https://github.com/chriskiehl/Gooey.git

如果你的网络不支持从GitHub克隆,请在Python实用宝典上回复:Gooey 下载项目源代码。

解压后进入该文件夹,运行 setup.py:

python setup.py install

2.使用方法

Gooey 通过将一个简单的装饰器附加到主函数上,然后使用GooeyParser可将你所有需要用到的参数可视化为文本框、选择框甚至是文件选择框。

比如在scihub文献下载的文章中,我们需要输入两个参数:1.关键词,2.下载篇数,使用Gooey可以这么改:

from gooey import Gooey, GooeyParser

@Gooey
def main():
    parser = GooeyParser(description="中文环境可用的scihub下载器 - @Python实用宝典") 
    parser.add_argument('path', help="下载路径", widget="DirChooser")
    parser.add_argument('keywords', help="关键词")
    parser.add_argument('limit', help="下载篇数")
    args = parser.parse_args()
    search(args.keywords, int(args.limit), args.path)

GooeyParser 和 ArgumentParser 一样,使用 add_argument 就可以增加输入参数,不同的是 GooeyParser 提供了可视化的选项:

parser.add_argument('path', help="下载路径", widget="DirChooser")

这一行代码,widget 参数给 args.path 变量提供了一个目录选择器(widget=”DirChooser”),help参数用于提醒用户该选择器的作用,效果如下:

当你不提供widget参数时,程序默认使用文本输入框。

parser.add_argument('keywords', help="关键词")
parser.add_argument('limit', help="下载篇数")

Gooey会自动编排你的参数,因此你不需要担心各个文本框或选择框的显示问题。

args = parser.parse_args()
search(args.keywords, int(args.limit), args.path)

args = parser.parse_args() 可以将用户输入的所有文本转化为对应对象的变量值,通过 args.var 可以直接提取对应的变量值。

这个简单的可视化程序完整代码及效果如下:

import asyncio
from scihub import SciHub
from gooey import Gooey, GooeyParser

def search(keywords: str, limit: int, path: str):
    """
    搜索相关论文并下载

    Args:
        keywords (str): 关键词
        limit (int): 篇数
        path (str): 下载路径
    """
    sh = SciHub()
    result = sh.search(keywords, limit=limit)
    print(result)

    loop = asyncio.get_event_loop()
    # 获取所有需要下载的scihub直链
    tasks = [sh.async_get_direct_url(paper["url"]) for paper in result.get("papers", [])]
    all_direct_urls = loop.run_until_complete(asyncio.gather(*tasks))
    print(all_direct_urls)

    # 下载所有论文
    loop.run_until_complete(sh.async_download(loop, all_direct_urls, path=path))
    loop.close()

@Gooey
def main():
    parser = GooeyParser(description="中文环境可用的scihub下载器 - @Python实用宝典") 
    parser.add_argument('path', help="下载路径", widget="DirChooser")
    parser.add_argument('keywords', help="关键词")
    parser.add_argument('limit', help="下载篇数")
    args = parser.parse_args()
    search(args.keywords, int(args.limit), args.path)

main()

这份代码想要完美地运行起来请结合 你不得不知道的python超级文献批量搜索下载工具 的 scihub.py.

你也完全可以使用自己的程序进行图形界面化,这无关紧要。

效果如下:

3.支持的widget组件

所有支持的widget组件如下:

1.勾选框 widget=”CheckBox”

2.下拉框 widget=”DropDown”

3.互斥选择框 widget=”RadioGroup”

4.各种目标类型的选择框

文件选择框 widget=”FileChooser”
目录选择框 widget=”DirChooser”
多文件选择框 widget=”MultiFileChooser”
文件保存目录 widget=”FileSaver”

5.日期/时间选择器 widget=”DateChooser/TimeChooser”

6.密码输入框 wiget=”PasswordField”

7.多选列表框 widget=”Listbox”

8.颜色选择器 widget=”ColourChooser”

9.可过滤的下拉框 widget=”FilterableDropdown”

10.滑片 widget=”Slider”

4.打包

在一切都测试完毕后使用正常后,你可以通过 pyinstaller 将这个可视化程序打包成exe可执行文件。

1.编写 PyInstaller buildspec

PyInstaller使用 buildspec 来确定如何捆绑项目。你可以在Python实用宝典后台回复 buildspec下载 build.spec.txt.

下载后你只需要改两行代码:

如下所示:

在路径前面带r,可以不用输入两个斜杆 ‘\’ 哦。

2.执行打包命令

为了能够使用 PyInstaller, 我们需要使用pip安装这个模块:

pip install pyinstaller

然后进入 build.spec.text 所在文件夹,执行以下命令打包程序:

pyinstaller build.spec

打包完成后会在当前文件夹下生成一个dist文件夹,里面就包含了你打包生成的可执行文件。

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典