整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Python打包成exe的方法介绍

Python打包成exe的方法介绍

ython的开发效率非常的高,但是当我们用python写一些小工具需要给用户使用的时候,用户大多数是没有安装python的。
本文介绍两种python的打包方案,使用pyinstaller和nuitka打包成exe(或其他操作系统的可执行程序)后便可以直接分发给用户,无需用户安装python。

示例程序

这边使用pyqt6来做演示,使用pyqt6我们可以快速创建一个跨平台原生gui程序,也是这两个打包工具最常用的场景之一。

安装pyqt6库:

pip install pyqt6

创建mainwindow.py,写入以下内容:

import sys
from PyQt6.QtWidgets import QWidget, QToolTip, QPushButton, QApplication
from PyQt6.QtGui import QFont

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        QToolTip.setFont(QFont("SansSerif", 10))
        self.setToolTip("This is a <b>QWidget</b> widget")
        btn=QPushButton("Button", self)
        btn.setToolTip("This is a <b>QPushButton</b> widget")
        btn.resize(btn.sizeHint())
        btn.move(50, 50)
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle("Tooltips")
        self.show()

def main():

    app=QApplication(sys.argv)
    ex=Example()
    sys.exit(app.exec())

if __name__=="__main__":
    main()

执行程序:

python mainwindow.py

执行后会打开一个demo窗口:

pyinstaller

安装:

pip installer pyinstaller

打包为文件夹:

pyinstaller -D -w ./mainwindow.py

该命令会打包exe、python解释器和其他dll到 dist/mainwindow 中。

打包为单个exe:

pyinstaller -F -w ./mainwindow.py

该命令只输出一个mainwindow.exe到dist目录中,打开 dist/mainwindow.exe 时会将所有依赖项解压到临时目录中然后运行,当然这一步对用户是无感的。
使用这两种方法生成的exe都可以直接分发给用户,pyinstaller是大多数时候的首选项,方便快捷。不过pyinstaller最大的问题是无法隐藏源码以及效率稍微慢一些。

nuitka

nuitka使用c语言编译器将python源码及模块编译成原生二进制,据此可以做到完全隐藏源码,同时提高运行效率。
安装:

pip installer nuitka

安装的时候nuitka会根据我们的操作系统选择最佳的c语言编译器。

打包为文件夹:

python -m nuitka mainwindow.py --standalone --enable-plugin=pyqt6 --disable-console

该命令会输出 mainwindow.exe 到当前目录下,我们可以直接拿来执行或者分发给其他用户。
需要注意的是这种方式也是解压到临时目录中,效率相比打包成文件夹慢一点,但是整体还是比 pyinstaller 快。

原文链接:https://juejin.cn/post/7369876349488775207

本说明

jdk:1.8

scala:2.11.8

spark:2.3.0

hadoop:2.8.3

环境准备

jdk配置

1、配置JAVA_HOME与Path:

Path

2、验证配置:

scala安装与配置

1、scala下载:

访问官方地址http://www.scala-lang.org/download/2.11.8.html

2、配置Path:

3、验证配置:

Spark安装与配置

1、spark下载:

访问官方地址http://spark.apache.org/downloads.html

选中官方推荐的地址即可下载,其他地址也可用(建议采用迅雷等下载工具下载,速度比较会快很多)

2、解压至D盘;

3、配置Path:

4、通过spark-shell进入Spark的交互式命令行模式:

如上,可以看到对应的spark、scala、java版本,同时也看到了异常信息,该异常信息是由于hadoop导致的,下面来配置hadoop。

Hadoop安装与配置

1、hadoop下载

访问官方http://hadoop.apache.org/releases.html

进入下载页,如下建议地址(同样建议用迅雷等下载工具下载,速度更快)

2、解压至

3、配置HADOOP_HOME&Path:

path:

4、winutils下载:https://github.com/steveloughran/winutils

下载对应版本的bin目录直接替换本地bin目录即可。

5、此时继续spark-shell进入spark命令行交互模式:

此时即不会出现上述的异常提示。

6、访问控制台中的webui如下:

、前言

本文实现RAR批量解压的功能,通过python脚本调用WinRAR.exe解压文件时似乎不会再有广告框弹出。

二、实现

通过python调用WinRAR.exe程序实现RAR文件的批量解压,代码如下:

import argparse
import os

class RarExtractor:
    def __init__(self, in_dir="./", out_dir="./", pwds=None, exe=None):
        self.in_dir=in_dir
        self.out_dir=out_dir
        self.pwds=pwds if pwds else ['1234']
        self.exe='"%s"' % exe if exe else '"C:\Program Files\WinRAR\WinRAR.exe"'

    def extract_files(self, pwds, file_path, dst):
        if not os.path.exists(dst):
            os.mkdir(dst)

        if os.path.isdir(dst) and os.path.isfile(file_path):
            try:
                for pwd in pwds:
                    extract_cmd=r'%s x -y -p%s %s %s' % (self.exe, pwd, file_path, dst)
                    if os.system(extract_cmd)==0:
                        print("Extract %s OK." % file_path)
                        return 0
                    else:
                        print("Extract %s failed." % file_path)
                        return -1
            except RuntimeError:
                print("error")
                return -1
        else:
            print('File not exist')
            return -1

    def extract_all_rar(self):
        for root, dirs, files in os.walk(self.in_dir):
            for f in files:
                (filename, ext)=os.path.splitext(f)
                if ext=='.rar':
                    file_path=os.path.join(root, f)
                    print(file_path)
                    self.extract_files(self.pwds, file_path, os.path.join(self.out_dir, filename))

def _parse_options():
    parser=argparse.ArgumentParser()
    parser.add_argument("--in_dir", action="store", dest="in_dir", required=True, help="Rar files dir")
    parser.add_argument("--out_dir", action="store", dest="out_dir", required=False, help="Extracted file dir")
    parser.add_argument("--pwds", nargs='+', action="store", dest="pwds", required=False,
                        help="Password list to extract Rar: --pwds 1111 2222 3333")
    parser.add_argument("--exe", action="store", dest="exe", required=False, help="RAR exe install path")
    return parser.parse_args()

if __name__=='__main__':
    options=_parse_options()
    extractor=RarExtractor(options.in_dir, options.out_dir, options.pwds, options.exe)
    extractor.extract_all_rar()

需要传入的参数为:

  • --in_dir RAR文件所在目录,默认是当前目录
  • --out_dir 指定解压后输出的目录,默认是当前目录
  • --pwds 如果RAR是加密的,则需要指定解压密码,可以指定多个密码,以空格隔开
  • --exe 指定WinRAR.exe所在的目录,默认是"C:\Program Files\WinRAR\WinRAR.exe"

三、测试

在目录D:\rar_test\下新建3个txt文件,使用RAR加密压缩,密码为1024、2048和4096。

通过以下命令测试:

python rar_extractor.py --in_dir D:\rar_test\ --out_dir D:\rar_test\ --pwds 1024 2048 4096 --exe "C:\Program Files\WinRAR\WinRAR.exe"