- 主篇 Python PyInstaller 打包成 Win、Mac 应用程序(app / exe),附:Python virturalenv + pyinstaller 最小化打包 python 程序。
- 要解决打包后的
win exe 或 mac 可执行文件
支持接收外部传参的功能。这里就用到了sys
包或者argparse
包,两者都能达到接收外部参数的目的。下面介绍两种方式传参。 - 可以通过拿到当前脚本的路径,然后拼上外部配置文件组成路径进行读取,省去了传入步骤。
import sys import os # 路径操作对象 print(os.path) # 返回当前脚本的路径 print(sys.executable) # 返回当前脚本的绝对路径 print(os.path.realpath(sys.executable)) # 去掉文件名,返回当前脚本的目录(也可以理解从里到外,去掉一层) print(os.path.dirname(os.path.realpath(sys.executable))) # 也可以嵌套多去掉几层,直到想要的文件夹即可 print(os.path.dirname(os.path.dirname(os.path.realpath(sys.executable)))) # 举例 # path = os.path.dirname(os.path.dirname(os.path.realpath(sys.executable))) # filePath = path + '/' + 'config.json' # 注意 mac、win 路径中的斜杠问题,可以使用转义符 '\\' '\/'
- 下面两种传参方式,打包后调用:
# mac 可执行文件也一样传,win 暂时没测试过,后续补上 $ main 1 2 3 # 但是打包的 mac 软件 不可以这么传,要么 gui 导入,要么内部写死一个路径读取(例如:网页)
import sys import json # 解析参数 in_filepath = sys.argv[1] # 参数 1 # out_style = sys.argv[2] # 参数 2 # out_filepath = sys.argv[3] # 参数 3 print("--input_filepath:",in_filepath) # print("--output_file_style",out_style) # print("--output_filepath",out_filepath) # 解析 json 文件 # obj = json.load(open('./test.json', 'r', encoding="utf-8")) # 解析动态路径 obj = json.load(open(in_filepath, 'r', encoding="utf-8")) # 输出使用 print(obj, obj[0])
- 调用方式:
# 传入方式 $ python test.py ./test.json # 多个则 空格 分隔开 $ python test.py 1 2 3
# 导入库 import argparse # 1. 定义命令行解析器对象 parser = argparse.ArgumentParser(description='Demo 参数介绍') # 2. 添加命令行参数(--xxx 为固定写法) parser.add_argument('--name', type=str, help='名称必须传字符串') parser.add_argument('--age', type=int, default=20, help='年龄必须传 int,默认 20 岁') # 3. 从命令行中结构化解析参数 args = parser.parse_args() print('输出参数集合:', args) epochs = args.name batch = args.age print('单个输出 {} {}'.format(epochs, batch))
- 调用方式:
# 传入方式,必须带上 key,得 key value 的形式传入 $ python test.py --name dzm # 多个则一直 key value 的方式往后拼接 $ python test.py --name dzm --age 30
# 怎么知道传参有哪些 $ python test.py -h # 会输出描述 usage: dzm.py [-h] [--name NAME] [--age AGE] Demo 参数介绍 options: -h, --help show this help message and exit --name NAME 名称必须传字符串 --age AGE 年龄必须传 int,默认 20 岁