2023年2月

安装

pip insatll Pyinstaller

参数

pyinstaller -Fw main.py
参数 概述
-F,-onefile 打包一个单个文件,如果你的代码都写在一个.py文件的话,可以用这个,如果是多个.py文件就别用
-D, –onedir 打包多个文件,在dist中生成很多依赖文件,适合以框架形式编写工具代码,我个人比较推荐这样,代码易于维护
-K, –tk 在部署时包含 TCL/TK
-a, –ascii 不包含编码.在支持Unicode的python版本上默认包含所有的编码.
-d, –debug 产生debug版本的可执行文件
-w,–windowed,–noconsole 使用Windows子系统执行.当程序启动的时候不会打开命令行(只对Windows有效)
-s,–strip 可执行文件和共享库将run through strip.注意Cygwin的strip往往使普通的win32 Dll无法使用.
-X, –upx 如果有UPX安装(执行Configure.py时检测),会压缩执行文件(Windows系统中的DLL也会)(参见note)
-o DIR, –out=DIR 指定spec文件的生成目录,如果没有指定,而且当前目录是PyInstaller的根目录,会自动创建一个用于输出(spec和生成的可执行文件)的目录.如果没有指定,而当前目录不是PyInstaller的根目录,则会输出到当前的目录下.
-p DIR, –path=DIR 设置导入路径(和使用PYTHONPATH效果相似).可以用路径分割符(Windows使用分号,Linux使用冒号)分割,指定多个目录.也可以使用多个-p参数来设置多个导入路径,让pyinstaller自己去找程序需要的资源
–icon=<FILE.ICO> 将file.ico添加为可执行文件的资源(只对Windows系统有效),改变程序的图标 pyinstaller -i ico路径 xxxxx.py
-v FILE, –version=FILE 将verfile作为可执行文件的版本资源(只对Windows系统有效)
-n NAME, –name=NAME 可选的项目(产生的spec的)名字.如果省略,第一个脚本的主文件名将作为spec的名字

注意事项

  • 如果程序有采用外部文件,如配置文件, 需要将文件放在dist中
  • -F 适合生成一个单一可执行的文件
  • -o 适用于多个文件引用情况,或者框架的结构

打包进程相关代码失败

例如编写一些进程相关的shell命令,打包失败,一般是使用 -F 可以成功,但是执行exe时有cmd弹窗,这非常不美观, 如果使用-Fw c参数执行exe 直接失败。 这种情况有两种解决方案。

方案一: 使用 pyinstaller -Dw file.py 生成的是一个目录文件。 程序执行成功,无黑名终端弹窗情况。

方案二: 起用 os.popen() 方法, 改用subprocess.Popen() 模块

​ 下面是我的测试,亲测成功, 参数一定要配置好,否则程序执行失败!

import subprocess
def checkprocess():
    processnames = ['EXCEL.EXE']
    for processname in processnames:
        p = subprocess.Popen('taskkill /F /IM %s' %processname,shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
        p.wait()
checkprocess()

有空写一个 关于subprocess的教程,详细研究一下他的参数配置

原理

使用python win32 库 调用word底层vba,将word转成pdf

安装pywin32

pip install pywin32 

python代码

from win32com.client import gencache
from win32com.client import constants, gencache

def createPdf(wordPath, pdfPath):
    """
    word转pdf
    :param wordPath: word文件路径
    :param pdfPath:  生成pdf文件路径
    """
    word = gencache.EnsureDispatch('Word.Application')
    doc = word.Documents.Open(wordPath, ReadOnly=1)
    doc.ExportAsFixedFormat(pdfPath,
                            constants.wdExportFormatPDF,
                            Item=constants.wdExportDocumentWithMarkup,
                            CreateBookmarks=constants.wdExportCreateHeadingBookmarks)
    word.Quit(constants.wdDoNotSaveChanges)

安装pdfminer 库

windows 下安装pdfminer3k

pip install pdfminer3k

Liunx 下安装pdfminer

pip install pdfminer

代码

from pdfminer.pdfparser import PDFParser, PDFDocument

from pdfminer.converter import PDFPageAggregator

from pdfminer.layout import LAParams, LTTextBoxHorizontal

from pdfminer.pdfinterp import PDFTextExtractionNotAllowed, PDFResourceManager, PDFPageInterpreter

def pdfParse(path):
"""
pdf文字提取
:param path:文件路径
:return: 每页结果列表
"""
fp = open(path, 'rb') # 以二进制读模式打开
# 用文件对象来创建一个pdf文档分析器
praser = PDFParser(fp)
# 创建一个PDF文档
doc = PDFDocument()
# 连接分析器 与文档对象
praser.set_document(doc)
doc.set_parser(praser)

# 提供初始化密码
# 如果没有密码 就创建一个空的字符串
doc.initialize()

# 检测文档是否提供txt转换,不提供就忽略
if not doc.is_extractable:
    raise PDFTextExtractionNotAllowed
else:
    # 创建PDf 资源管理器 来管理共享资源
    rsrcmgr = PDFResourceManager()
    # 创建一个PDF设备对象
    laparams = LAParams()
    device = PDFPageAggregator(rsrcmgr, laparams=laparams)
    # 创建一个PDF解释器对象
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    #每页文字内容
    results = []
    # 循环遍历列表,每次处理一个page的内容
    for page in doc.get_pages():  # doc.get_pages() 获取page列表
        interpreter.process_page(page)
        # 接受该页面的LTPage对象
        layout = device.get_result()
        # 这里layout是一个LTPage对象 里面存放着 这个page解析出的各种对象 一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等 想要获取文本就获得对象的text属性,
        for x in layout:
            if isinstance(x, LTTextBoxHorizontal):
                results.append(x.get_text())
    return results

该库是根据 迭代pdf每一页 进行文字提取, 也可以识别判断页码的功能

另外还有一个pypdf2 库也可以识别但是感觉不如这个准确

stackoverflow访问很慢

1、更改host文件 文件地址: C:\Windows\System32\Drivers\etc

​ 如果不能直接修改,可拷贝到桌面修改后再复制回去

2、在host文件追加

127.0.0.1    ajax.googleapis.com

3、打开cmd执行dns刷新命令

ipconfig /flushdns

ubuntu命令行安装中文环境

查看当前语言环境

echo $LANG

安装中文语言包

sudo apt update
sudo apt install language-pack-zh-hans

编辑 locale文件

sudo vim /etc/default/locale
LANG="zh_CN.UTF-8"
LANGUAGE="zh_CN:zh"
LC_NUMERIC="zh_CN"
LC_TIME="zh_CN"
LC_MONETARY="zh_CN"
LC_PAPER="zh_CN"
LC_NAME="zh_CN"
LC_ADDRESS="zh_CN"
LC_TELEPHONE="zh_CN"
LC_MEASUREMENT="zh_CN"
LC_IDENTIFICATION="zh_CN"
LC_ALL="zh_CN.UTF-8"

编辑 environment 文件

sudo vim /etc/environment
LANG="zh_CN.UTF-8"
LANGUAGE="zh_CN:zh"
LC_NUMERIC="zh_CN"
LC_TIME="zh_CN"
LC_MONETARY="zh_CN"
LC_PAPER="zh_CN"
LC_NAME="zh_CN"
LC_ADDRESS="zh_CN"
LC_TELEPHONE="zh_CN"
LC_MEASUREMENT="zh_CN"
LC_IDENTIFICATION="zh_CN"
LC_ALL="zh_CN.UTF-8"

重启 检查语言环境是否切换成功

sudo reboot
echo $LANG