合并程序
This commit is contained in:
1 parent
cc15c76e62
commit
968189dee9
22 files changed
+518
-480
No files matched your search
@@ -0,0 +1,2 @@
|
||||
# download_batch_data package
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
@echo off
|
||||
chcp 65001 >nul
|
||||
echo ========================================
|
||||
echo 开始打包 factory_sliceing 为 Windows EXE
|
||||
echo ========================================
|
||||
echo.
|
||||
|
||||
REM 检查 Python 是否安装
|
||||
python --version >nul 2>&1
|
||||
if errorlevel 1 (
|
||||
echo [错误] 未找到 Python,请先安装 Python
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo [1/4] 检查并安装依赖包...
|
||||
python -m pip install --upgrade pip
|
||||
python -m pip install redis>=4.0.0 oss2>=2.17.0 requests>=2.28.0 pyinstaller>=5.0.0
|
||||
|
||||
if errorlevel 1 (
|
||||
echo [错误] 依赖包安装失败
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo.
|
||||
echo [2/4] 清理之前的构建文件...
|
||||
if exist build rmdir /s /q build
|
||||
if exist dist rmdir /s /q dist
|
||||
if exist __pycache__ rmdir /s /q __pycache__
|
||||
for /d /r . %%d in (__pycache__) do @if exist "%%d" rmdir /s /q "%%d"
|
||||
|
||||
echo.
|
||||
echo [3/4] 使用 PyInstaller 打包...
|
||||
pyinstaller build_exe.spec --clean --noconfirm
|
||||
|
||||
if errorlevel 1 (
|
||||
echo [错误] 打包失败
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo.
|
||||
echo [4/4] 打包完成!
|
||||
echo.
|
||||
echo ========================================
|
||||
echo 打包结果:
|
||||
echo ========================================
|
||||
echo EXE 文件位置: dist\factory_sliceing.exe
|
||||
echo.
|
||||
echo 使用说明:
|
||||
echo 1. 将 dist\factory_sliceing.exe 复制到目标 Windows 机器
|
||||
echo 2. 在命令行中运行: factory_sliceing.exe --work-dir D:\work
|
||||
echo.
|
||||
echo ========================================
|
||||
pause
|
||||
|
||||
|
||||
|
||||
@@ -1,152 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
打包脚本 - 将 main.py 打包成 Windows EXE 文件
|
||||
使用方法: python build_exe.py
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import subprocess
|
||||
import shutil
|
||||
|
||||
def check_python_version():
|
||||
"""检查 Python 版本"""
|
||||
if sys.version_info < (3, 7):
|
||||
print("[错误] 需要 Python 3.7 或更高版本")
|
||||
return False
|
||||
print(f"[信息] Python 版本: {sys.version}")
|
||||
return True
|
||||
|
||||
def install_dependencies():
|
||||
"""安装依赖包"""
|
||||
print("\n[1/4] 检查并安装依赖包...")
|
||||
dependencies = [
|
||||
'redis>=4.0.0',
|
||||
'oss2>=2.17.0',
|
||||
'requests>=2.28.0',
|
||||
'pyinstaller>=5.0.0',
|
||||
]
|
||||
|
||||
for dep in dependencies:
|
||||
print(f" 安装 {dep}...")
|
||||
result = subprocess.run(
|
||||
[sys.executable, '-m', 'pip', 'install', '--upgrade', dep],
|
||||
capture_output=True,
|
||||
text=True
|
||||
)
|
||||
if result.returncode != 0:
|
||||
print(f"[错误] 安装 {dep} 失败: {result.stderr}")
|
||||
return False
|
||||
|
||||
print("[成功] 所有依赖包已安装")
|
||||
return True
|
||||
|
||||
def clean_build_files():
|
||||
"""清理之前的构建文件"""
|
||||
print("\n[2/4] 清理之前的构建文件...")
|
||||
|
||||
dirs_to_remove = ['build', 'dist']
|
||||
for dir_name in dirs_to_remove:
|
||||
if os.path.exists(dir_name):
|
||||
shutil.rmtree(dir_name)
|
||||
print(f" 已删除: {dir_name}")
|
||||
|
||||
# 清理 __pycache__ 目录
|
||||
for root, dirs, files in os.walk('.'):
|
||||
if '__pycache__' in dirs:
|
||||
pycache_path = os.path.join(root, '__pycache__')
|
||||
shutil.rmtree(pycache_path)
|
||||
print(f" 已删除: {pycache_path}")
|
||||
|
||||
print("[成功] 清理完成")
|
||||
return True
|
||||
|
||||
def build_exe():
|
||||
"""使用 PyInstaller 打包"""
|
||||
print("\n[3/4] 使用 PyInstaller 打包...")
|
||||
|
||||
spec_file = 'build_exe.spec'
|
||||
if not os.path.exists(spec_file):
|
||||
print(f"[错误] 未找到配置文件: {spec_file}")
|
||||
return False
|
||||
|
||||
result = subprocess.run(
|
||||
[sys.executable, '-m', 'PyInstaller', spec_file, '--clean', '--noconfirm'],
|
||||
capture_output=True,
|
||||
text=True
|
||||
)
|
||||
|
||||
if result.returncode != 0:
|
||||
print(f"[错误] 打包失败:")
|
||||
print(result.stderr)
|
||||
return False
|
||||
|
||||
print("[成功] 打包完成")
|
||||
return True
|
||||
|
||||
def show_result():
|
||||
"""显示打包结果"""
|
||||
print("\n" + "="*50)
|
||||
print("打包结果:")
|
||||
print("="*50)
|
||||
|
||||
exe_path = os.path.join('dist', 'factory_sliceing.exe')
|
||||
if os.path.exists(exe_path):
|
||||
file_size = os.path.getsize(exe_path) / (1024 * 1024) # MB
|
||||
print(f"✓ EXE 文件位置: {exe_path}")
|
||||
print(f"✓ 文件大小: {file_size:.2f} MB")
|
||||
else:
|
||||
print(f"✗ 未找到 EXE 文件: {exe_path}")
|
||||
|
||||
print("\n使用说明:")
|
||||
print(" 1. 将 dist/factory_sliceing.exe 复制到目标 Windows 机器")
|
||||
print(" 2. 在命令行中运行: factory_sliceing.exe --work-dir D:\\work")
|
||||
print("="*50)
|
||||
|
||||
def main():
|
||||
"""主函数"""
|
||||
print("="*50)
|
||||
print("开始打包 factory_sliceing 为 Windows EXE")
|
||||
print("="*50)
|
||||
|
||||
# 切换到脚本所在目录
|
||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
os.chdir(script_dir)
|
||||
print(f"[信息] 工作目录: {script_dir}")
|
||||
|
||||
# 检查 Python 版本
|
||||
if not check_python_version():
|
||||
return 1
|
||||
|
||||
# 安装依赖
|
||||
if not install_dependencies():
|
||||
return 1
|
||||
|
||||
# 清理构建文件
|
||||
if not clean_build_files():
|
||||
return 1
|
||||
|
||||
# 打包
|
||||
if not build_exe():
|
||||
return 1
|
||||
|
||||
# 显示结果
|
||||
show_result()
|
||||
|
||||
return 0
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
sys.exit(main())
|
||||
except KeyboardInterrupt:
|
||||
print("\n\n[中断] 用户取消操作")
|
||||
sys.exit(1)
|
||||
except Exception as e:
|
||||
print(f"\n[错误] 发生异常: {str(e)}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
|
||||
@@ -1,58 +0,0 @@
|
||||
# -*- mode: python ; coding: utf-8 -*-
|
||||
|
||||
block_cipher = None
|
||||
|
||||
a = Analysis(
|
||||
['main.py'],
|
||||
pathex=[],
|
||||
binaries=[],
|
||||
datas=[
|
||||
# 将 small_machine_transform.py 作为数据文件包含,以便 Blender 可以调用
|
||||
('utils/small_machine_transform.py', 'utils'),
|
||||
],
|
||||
hiddenimports=[
|
||||
'redis',
|
||||
'oss2',
|
||||
'requests',
|
||||
'utils.oss_redis',
|
||||
'utils.funcs',
|
||||
'utils.logs',
|
||||
'utils.oss_func',
|
||||
'utils.changeFiles',
|
||||
'utils.small_machine_transform',
|
||||
],
|
||||
hookspath=[],
|
||||
hooksconfig={},
|
||||
runtime_hooks=[],
|
||||
excludes=[],
|
||||
win_no_prefer_redirects=False,
|
||||
win_private_assemblies=False,
|
||||
cipher=block_cipher,
|
||||
noarchive=False,
|
||||
)
|
||||
|
||||
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
|
||||
|
||||
exe = EXE(
|
||||
pyz,
|
||||
a.scripts,
|
||||
a.binaries,
|
||||
a.zipfiles,
|
||||
a.datas,
|
||||
[],
|
||||
name='factory_sliceing',
|
||||
debug=False,
|
||||
bootloader_ignore_signals=False, # 允许信号传播,使 Ctrl+C 可以中断
|
||||
strip=False,
|
||||
upx=True,
|
||||
upx_exclude=[],
|
||||
runtime_tmpdir=None,
|
||||
console=True, # 显示控制台窗口
|
||||
disable_windowed_traceback=False,
|
||||
argv_emulation=False,
|
||||
target_arch=None,
|
||||
codesign_identity=None,
|
||||
entitlements_file=None,
|
||||
icon=None, # 可以指定图标文件路径,例如: 'icon.ico'
|
||||
)
|
||||
|
||||
Binary file not shown.
@@ -1,158 +0,0 @@
|
||||
import os,shutil
|
||||
import redis
|
||||
import oss2,time,sys
|
||||
import requests
|
||||
import argparse,json
|
||||
from utils.funcs import requestApiToUpdateSliceStatus
|
||||
|
||||
# 将当前脚本所在目录添加到 Python 路径,以便导入 utils 模块
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
# from download_print_out import download_transform_save_by_json
|
||||
from utils.oss_redis import redisClient
|
||||
from utils.funcs import downloadJsonAndJpgFileAndMoveToCorrectDir, downloadDataByOssAndTransformSave
|
||||
# 默认使用脚本所在目录
|
||||
currentDir = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
ENV = 'prod'
|
||||
url = 'https://mp.api.suwa3d.com'
|
||||
if ENV == 'dev':
|
||||
url = 'http://mp.api.dev.com'
|
||||
elif ENV == 'prod':
|
||||
url = 'https://mp.api.suwa3d.com'
|
||||
|
||||
|
||||
#判断是否上传了 JSON 文件
|
||||
def step1(versionId):
|
||||
|
||||
# 下载json 文件 和 图片
|
||||
dirName,machineInfo = downloadJsonAndJpgFileAndMoveToCorrectDir(versionId,currentDir)
|
||||
if not dirName:
|
||||
return False
|
||||
|
||||
#判断是否是小机台
|
||||
isSmallMachine = False
|
||||
if str(machineInfo["machine_type"]) == '1':
|
||||
isSmallMachine = True
|
||||
|
||||
|
||||
#下载数据,转换数据
|
||||
res = downloadDataByOssAndTransformSave(dirName,isSmallMachine)
|
||||
if not res:
|
||||
return False
|
||||
|
||||
#判断下载的obj文件数量和json里的是否一致,排除arrange文件夹
|
||||
objFilePath = os.path.join(dirName, 'data')
|
||||
objCounts = 0
|
||||
for file in os.listdir(objFilePath):
|
||||
if file == 'arrange':
|
||||
continue
|
||||
if file.endswith('.obj'):
|
||||
objCounts += 1
|
||||
|
||||
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 下载处理完成的obj文件数量: {objCounts}')
|
||||
# requestApiToUpdateSliceStatus(versionId,objCounts)
|
||||
|
||||
|
||||
|
||||
# 读取 队列中一个数据出来
|
||||
def main(work_dir=None, batch_id=None):
|
||||
|
||||
global currentDir
|
||||
# 如果指定了工作目录,使用指定的目录
|
||||
if work_dir:
|
||||
work_dir = os.path.abspath(work_dir)
|
||||
if not os.path.exists(work_dir):
|
||||
print(f'指定的工作目录不存在: {work_dir},将创建该目录')
|
||||
os.makedirs(work_dir, exist_ok=True)
|
||||
currentDir = work_dir
|
||||
print(f'使用指定的工作目录: {currentDir}')
|
||||
else:
|
||||
print(f'没有指定工作目录,退出')
|
||||
exit(0)
|
||||
|
||||
|
||||
versionId = str(batch_id)
|
||||
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 正在处理版次ID={versionId}')
|
||||
res = step1(versionId)
|
||||
if res == False:
|
||||
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} JSON文件下载数据失败,等待10秒')
|
||||
# time.sleep(10)
|
||||
# continue
|
||||
# 循环处理,直到队列为空
|
||||
# try:
|
||||
# while True:
|
||||
# try:
|
||||
# r = redisClient()
|
||||
# #检测队列是否有值
|
||||
# if r.scard('pb:sliceing') == 0:
|
||||
# print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 队列为空,等待10秒')
|
||||
# time.sleep(10)
|
||||
# continue
|
||||
# #获取队列中的值
|
||||
# data = r.spop('pb:sliceing')
|
||||
# if data is None:
|
||||
# print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 取出的数据为空,等待10秒')
|
||||
# time.sleep(10)
|
||||
# continue
|
||||
# data = data.decode('utf-8')
|
||||
# #判断是否是数字
|
||||
# if not data.isdigit():
|
||||
# print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 取出的数据不是数字,等待10秒')
|
||||
# time.sleep(10)
|
||||
# continue
|
||||
|
||||
# versionId = str(data)
|
||||
# print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 正在处理版次ID={versionId}')
|
||||
# res = step1(versionId)
|
||||
# if res == False:
|
||||
# print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} JSON文件下载数据失败,等待10秒')
|
||||
# time.sleep(10)
|
||||
# continue
|
||||
|
||||
|
||||
|
||||
|
||||
# # 在长时间操作后,确保 Redis 连接仍然有效
|
||||
# # 通过重新获取客户端来触发连接检查
|
||||
# try:
|
||||
# r = redisClient()
|
||||
# r.ping() # 测试连接
|
||||
# except Exception as e:
|
||||
# print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} Redis连接检查失败: {str(e)},将在下次循环时自动重连')
|
||||
|
||||
# #time.sleep(10)
|
||||
# except KeyboardInterrupt:
|
||||
# # 在循环内部捕获 KeyboardInterrupt,允许在 sleep 或操作中被中断
|
||||
# raise # 重新抛出,让外层捕获
|
||||
# except KeyboardInterrupt:
|
||||
# print(f'\n{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 收到中断信号,正在优雅退出...')
|
||||
# print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 程序已停止')
|
||||
# sys.exit(0)
|
||||
|
||||
|
||||
def testMain():
|
||||
global currentDir
|
||||
currentDir = "/Users/dcx/code/make2/script/factory_sliceing_v2/tempData"
|
||||
versionId = '10153' #'10153 10158'
|
||||
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 正在处理版次ID={versionId}')
|
||||
res = step1(versionId)
|
||||
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 处理完成,res={res}')
|
||||
|
||||
if __name__ == '__main__':
|
||||
#testMain() 新增参数 batchId
|
||||
parser = argparse.ArgumentParser(description='排版打印订单处理程序')
|
||||
parser.add_argument(
|
||||
'--work-dir',
|
||||
type=str,
|
||||
default=None,
|
||||
help='指定工作目录(磁盘路径),例如: D:/work 或 /Users/username/work。如果不指定,则使用脚本所在目录'
|
||||
)
|
||||
parser.add_argument(
|
||||
'--batch—id',
|
||||
type=str,
|
||||
default=None,
|
||||
help='指定批次ID'
|
||||
)
|
||||
args = parser.parse_args()
|
||||
main(work_dir=args.work_dir, batch_id=args.batch_id)
|
||||
+27
-18
@@ -3,14 +3,11 @@ import redis
|
||||
import oss2,time,sys
|
||||
import requests
|
||||
import argparse,json
|
||||
from utils.funcs import requestApiToUpdateSliceStatus
|
||||
|
||||
# 将当前脚本所在目录添加到 Python 路径,以便导入 utils 模块
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
from .utils.funcs import requestApiToUpdateSliceStatus
|
||||
|
||||
# from download_print_out import download_transform_save_by_json
|
||||
from utils.oss_redis import redisClient
|
||||
from utils.funcs import downloadJsonAndJpgFileAndMoveToCorrectDir, downloadDataByOssAndTransformSave
|
||||
from .utils.oss_redis import redisClient
|
||||
from .utils.funcs import downloadJsonAndJpgFileAndMoveToCorrectDir, downloadDataByOssAndTransformSave
|
||||
# 默认使用脚本所在目录
|
||||
currentDir = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
@@ -51,7 +48,19 @@ def step1(versionId):
|
||||
objCounts += 1
|
||||
|
||||
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 下载处理完成的obj文件数量: {objCounts}')
|
||||
requestApiToUpdateSliceStatus(versionId,objCounts)
|
||||
isSuccess = requestApiToUpdateSliceStatus(versionId,objCounts)
|
||||
if not isSuccess:
|
||||
return False
|
||||
#塞入切片的队列 ,SADD 插入 , {batchId}_{machineType}_No{machineId}
|
||||
machineType = ""
|
||||
if machineInfo["machine_type"] == '1':
|
||||
machineType = 'small'
|
||||
elif machineInfo["machine_type"] == '2':
|
||||
machineType = 'big'
|
||||
keyValue = f'{versionId}_{machineType}_No{machineInfo["id"]}'
|
||||
r = redisClient()
|
||||
r.sadd('pb:to_sliceing', keyValue)
|
||||
return True
|
||||
|
||||
|
||||
|
||||
@@ -131,14 +140,14 @@ def testMain():
|
||||
res = step1(versionId)
|
||||
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 处理完成,res={res}')
|
||||
|
||||
if __name__ == '__main__':
|
||||
#testMain()
|
||||
parser = argparse.ArgumentParser(description='排版打印订单处理程序')
|
||||
parser.add_argument(
|
||||
'--work-dir',
|
||||
type=str,
|
||||
default=None,
|
||||
help='指定工作目录(磁盘路径),例如: D:/work 或 /Users/username/work。如果不指定,则使用脚本所在目录'
|
||||
)
|
||||
args = parser.parse_args()
|
||||
main(work_dir=args.work_dir)
|
||||
# if __name__ == '__main__':
|
||||
# #testMain()
|
||||
# parser = argparse.ArgumentParser(description='排版打印订单处理程序')
|
||||
# parser.add_argument(
|
||||
# '--work-dir',
|
||||
# type=str,
|
||||
# default=None,
|
||||
# help='指定工作目录(磁盘路径),例如: D:/work 或 /Users/username/work。如果不指定,则使用脚本所在目录'
|
||||
# )
|
||||
# args = parser.parse_args()
|
||||
# main(work_dir=args.work_dir)
|
||||
@@ -1,7 +0,0 @@
|
||||
redis>=4.0.0
|
||||
oss2>=2.17.0
|
||||
requests>=2.28.0
|
||||
pyinstaller>=5.0.0
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
# utils package
|
||||
|
||||
@@ -116,6 +116,11 @@ def requestApiToUpdateSliceStatus(versionId, downloadCounts):
|
||||
log(f'状态变更请求失败, res={res.text}')
|
||||
return False
|
||||
log(f'状态变更请求成功, res={res.text}')
|
||||
#判断返回的code是否是1000
|
||||
if res.json()["code"] != 1000:
|
||||
log(f'状态变更请求失败, res={res.text}')
|
||||
return False
|
||||
log(f'状态变更请求成功, res={res.text}')
|
||||
return True
|
||||
except requests.exceptions.Timeout:
|
||||
log(f'状态变更请求超时, url={api_url}')
|
||||
|
||||
Reference in new issue
Block a user