From cc15c76e62142d42edca7e7ead6803f73a13a309 Mon Sep 17 00:00:00 2001 From: dongchangxi <458593490@qq.com> Date: Tue, 9 Dec 2025 16:34:35 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9B=AE=E5=BD=95=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .../auto_sliceing_operate/main.py | 0 .../utils/__pycache__/logs.cpython-311.pyc | Bin 0 -> 536 bytes .../utils/click_soft_button.py | 11 +- .../utils/exe_operate.py | 0 .../utils/import_all_file.py | 0 .../auto_sliceing_operate/utils/logs.py | 0 .../auto_sliceing_operate/utils/miniIo.py | 188 ++++++++++++++++++ .../auto_sliceing_operate/utils/oss_func.py | 0 .../auto_sliceing_operate/utils/oss_redis.py | 0 .../auto_sliceing_operate/utils/zip.py | 69 +++++++ .../download_batch_data}/build_exe.bat | 0 .../download_batch_data}/build_exe.py | 0 .../download_batch_data}/build_exe.spec | 0 .../dist/factory_sliceing.exe | Bin .../download_batch_data}/download.py | 0 .../download_batch_data}/main.py | 0 .../download_batch_data}/requirements.txt | 0 .../download_batch_data}/utils/changeFiles.py | 0 .../download_batch_data}/utils/funcs.py | 0 .../download_batch_data}/utils/logs.py | 0 .../download_batch_data}/utils/oss_func.py | 0 .../download_batch_data}/utils/oss_redis.py | 0 .../utils/small_machine_transform.py | 0 script/test.py | 65 ++---- script/test1.py | 51 ++--- 26 files changed, 297 insertions(+), 88 deletions(-) rename {script => factory_sliceing}/auto_sliceing_operate/main.py (100%) create mode 100644 factory_sliceing/auto_sliceing_operate/utils/__pycache__/logs.cpython-311.pyc rename {script => factory_sliceing}/auto_sliceing_operate/utils/click_soft_button.py (89%) rename {script => factory_sliceing}/auto_sliceing_operate/utils/exe_operate.py (100%) rename {script => factory_sliceing}/auto_sliceing_operate/utils/import_all_file.py (100%) rename {script => factory_sliceing}/auto_sliceing_operate/utils/logs.py (100%) create mode 100644 factory_sliceing/auto_sliceing_operate/utils/miniIo.py rename {script => factory_sliceing}/auto_sliceing_operate/utils/oss_func.py (100%) rename {script => factory_sliceing}/auto_sliceing_operate/utils/oss_redis.py (100%) create mode 100644 factory_sliceing/auto_sliceing_operate/utils/zip.py rename {script/factory_sliceing_v2 => factory_sliceing/download_batch_data}/build_exe.bat (100%) rename {script/factory_sliceing_v2 => factory_sliceing/download_batch_data}/build_exe.py (100%) rename {script/factory_sliceing_v2 => factory_sliceing/download_batch_data}/build_exe.spec (100%) rename {script/factory_sliceing_v2 => factory_sliceing/download_batch_data}/dist/factory_sliceing.exe (100%) rename {script/factory_sliceing_v2 => factory_sliceing/download_batch_data}/download.py (100%) rename {script/factory_sliceing_v2 => factory_sliceing/download_batch_data}/main.py (100%) rename {script/factory_sliceing_v2 => factory_sliceing/download_batch_data}/requirements.txt (100%) rename {script/factory_sliceing_v2 => factory_sliceing/download_batch_data}/utils/changeFiles.py (100%) rename {script/factory_sliceing_v2 => factory_sliceing/download_batch_data}/utils/funcs.py (100%) rename {script/factory_sliceing_v2 => factory_sliceing/download_batch_data}/utils/logs.py (100%) rename {script/factory_sliceing_v2 => factory_sliceing/download_batch_data}/utils/oss_func.py (100%) rename {script/factory_sliceing_v2 => factory_sliceing/download_batch_data}/utils/oss_redis.py (100%) rename {script/factory_sliceing_v2 => factory_sliceing/download_batch_data}/utils/small_machine_transform.py (100%) diff --git a/.gitignore b/.gitignore index 626cc07..2187920 100644 --- a/.gitignore +++ b/.gitignore @@ -77,3 +77,4 @@ script/auto_sliceing_operate/__pycache__/ script/test.py script/test1.py factory_sliceing/auto_sliceing_operate/__pycache__/ +factory_sliceing/download_batch_data/utils/__pycache__/ diff --git a/script/auto_sliceing_operate/main.py b/factory_sliceing/auto_sliceing_operate/main.py similarity index 100% rename from script/auto_sliceing_operate/main.py rename to factory_sliceing/auto_sliceing_operate/main.py diff --git a/factory_sliceing/auto_sliceing_operate/utils/__pycache__/logs.cpython-311.pyc b/factory_sliceing/auto_sliceing_operate/utils/__pycache__/logs.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cefe36efb2365b9c26e41b865275614c383abbf3 GIT binary patch literal 536 zcmZuuJxIeq6uxVs{WF5#=F%lYz&6E2EF$fsOXE--EJz8-S)xf(?yjQZP{C2>4#l-1 zU3GVMYN3M!oSfVW-8%U$HbudAckg}g?t9<8;~o_yg}~l!HXRS*r${1;&A?<8KnK~# z#xANNJ9dkz*v1v4Nne6uSa`-1Ar4D|H8}^@LHySl7yC0ijnqN)&;Fd#17<&>qaN`4 z^O`PnagDm@LF$2ie|`ssE=6C))rxwQRlTfgXVkrdS}v%SDb8qeu+XGVg9kEqJQ5@r zrzaswy1r$)0%|yjdxSBwPMFZmOpE#YhDHt0Gb9d@i?{xu8ltA(2`v6`n%MSyyXBG{x(umkpRI!%OBmyK Slx~M(EMvTn$LN0_s(k~Otad>F literal 0 HcmV?d00001 diff --git a/script/auto_sliceing_operate/utils/click_soft_button.py b/factory_sliceing/auto_sliceing_operate/utils/click_soft_button.py similarity index 89% rename from script/auto_sliceing_operate/utils/click_soft_button.py rename to factory_sliceing/auto_sliceing_operate/utils/click_soft_button.py index fa7c942..0402304 100644 --- a/script/auto_sliceing_operate/utils/click_soft_button.py +++ b/factory_sliceing/auto_sliceing_operate/utils/click_soft_button.py @@ -1,9 +1,10 @@ import uiautomation as auto +softName = "赛纳3D打印控制系统 V1.4.3.2" # 遍历所有控件 找到 -def findAndClickFileImportShow(control, depth=0,index=1): +def findAndClick(control, depth=0,index=1): for child in control.GetChildren(): # print(child) # print(' ' * depth + f"{child.ControlType}: {child.Name} | {child.AutomationId}") @@ -70,12 +71,12 @@ def findAndClickFileImportShow(control, depth=0,index=1): # 点击导入文件按钮 def clickFileIMportShow(): - control = auto.WindowControl(searchDepth=1, Name='赛纳3D打印控制系统 V1.4.3.2') - clickRes = findAndClickFileImportShow(control,index=1) + control = auto.WindowControl(searchDepth=1, Name=softName) + clickRes = findAndClick(control,index=1) return clickRes # 点击开始切片按钮 def clickBegingSlice(): - control = auto.WindowControl(searchDepth=1, Name='赛纳3D打印控制系统 V1.4.3.2') - clickRes = findAndClickFileImportShow(control,index=2) + control = auto.WindowControl(searchDepth=1, Name=softName) + clickRes = findAndClick(control,index=2) return clickRes diff --git a/script/auto_sliceing_operate/utils/exe_operate.py b/factory_sliceing/auto_sliceing_operate/utils/exe_operate.py similarity index 100% rename from script/auto_sliceing_operate/utils/exe_operate.py rename to factory_sliceing/auto_sliceing_operate/utils/exe_operate.py diff --git a/script/auto_sliceing_operate/utils/import_all_file.py b/factory_sliceing/auto_sliceing_operate/utils/import_all_file.py similarity index 100% rename from script/auto_sliceing_operate/utils/import_all_file.py rename to factory_sliceing/auto_sliceing_operate/utils/import_all_file.py diff --git a/script/auto_sliceing_operate/utils/logs.py b/factory_sliceing/auto_sliceing_operate/utils/logs.py similarity index 100% rename from script/auto_sliceing_operate/utils/logs.py rename to factory_sliceing/auto_sliceing_operate/utils/logs.py diff --git a/factory_sliceing/auto_sliceing_operate/utils/miniIo.py b/factory_sliceing/auto_sliceing_operate/utils/miniIo.py new file mode 100644 index 0000000..a0339f3 --- /dev/null +++ b/factory_sliceing/auto_sliceing_operate/utils/miniIo.py @@ -0,0 +1,188 @@ +import os +from minio import Minio +from minio.error import S3Error +from .logs import log + +# MiniIO 客户端单例模式 +class MiniIOClientSingleton: + _instance = None + _client = None + + def __new__(cls): + if cls._instance is None: + cls._instance = super(MiniIOClientSingleton, cls).__new__(cls) + return cls._instance + + def get_client(self): + if self._client is None: + # MiniIO 连接配置 + # 可以从环境变量或配置文件中读取 + endpoint = os.getenv('MINIO_ENDPOINT', 'localhost:9000') + access_key = os.getenv('MINIO_ACCESS_KEY', 'minioadmin') + secret_key = os.getenv('MINIO_SECRET_KEY', 'minioadmin') + secure = os.getenv('MINIO_SECURE', 'False').lower() == 'true' + + try: + self._client = Minio( + endpoint, + access_key=access_key, + secret_key=secret_key, + secure=secure + ) + log(f"MiniIO 客户端初始化成功: {endpoint}") + except Exception as e: + log(f"MiniIO 客户端初始化失败: {str(e)}") + raise + return self._client + + +def miniIOClient(): + """获取 MiniIO 客户端单例""" + return MiniIOClientSingleton().get_client() + + +def upload_file(bucket_name, object_name, file_path): + """ + 上传文件到 MiniIO + + Args: + bucket_name: 存储桶名称 + object_name: 对象名称(在 MiniIO 中的路径) + file_path: 本地文件路径 + + Returns: + bool: 上传成功返回 True,失败返回 False + """ + try: + client = miniIOClient() + + # 检查存储桶是否存在,不存在则创建 + if not client.bucket_exists(bucket_name): + client.make_bucket(bucket_name) + log(f"创建存储桶: {bucket_name}") + + # 上传文件 + log(f"开始上传文件: {file_path} -> {bucket_name}/{object_name}") + client.fput_object(bucket_name, object_name, file_path) + log(f"文件上传成功: {bucket_name}/{object_name}") + return True + except S3Error as e: + log(f"上传文件失败 (S3Error): {str(e)}") + return False + except Exception as e: + log(f"上传文件失败: {str(e)}") + return False + + +def download_file(bucket_name, object_name, file_path): + """ + 从 MiniIO 下载文件到本地 + + Args: + bucket_name: 存储桶名称 + object_name: 对象名称(在 MiniIO 中的路径) + file_path: 本地保存路径 + + Returns: + bool: 下载成功返回 True,失败返回 False + """ + try: + client = miniIOClient() + + # 检查文件是否存在 + if not check_file_exists(bucket_name, object_name): + log(f"文件不存在: {bucket_name}/{object_name}") + return False + + # 确保本地目录存在 + local_dir = os.path.dirname(file_path) + if local_dir and not os.path.exists(local_dir): + os.makedirs(local_dir, exist_ok=True) + + # 下载文件 + log(f"开始下载文件: {bucket_name}/{object_name} -> {file_path}") + client.fget_object(bucket_name, object_name, file_path) + + # 验证文件是否下载成功 + if os.path.exists(file_path): + file_size = os.path.getsize(file_path) + log(f"文件下载成功: {file_path} (大小: {file_size} 字节)") + return True + else: + log("文件下载失败: 本地文件不存在") + return False + except S3Error as e: + log(f"下载文件失败 (S3Error): {str(e)}") + return False + except Exception as e: + log(f"下载文件失败: {str(e)}") + return False + + +def delete_file(bucket_name, object_name): + """ + 从 MiniIO 删除文件 + + Args: + bucket_name: 存储桶名称 + object_name: 对象名称(在 MiniIO 中的路径) + + Returns: + bool: 删除成功返回 True,失败返回 False + """ + try: + client = miniIOClient() + + # 检查文件是否存在 + if not check_file_exists(bucket_name, object_name): + log(f"文件不存在,无需删除: {bucket_name}/{object_name}") + return True + + # 删除文件 + log(f"开始删除文件: {bucket_name}/{object_name}") + client.remove_object(bucket_name, object_name) + log(f"文件删除成功: {bucket_name}/{object_name}") + return True + except S3Error as e: + log(f"删除文件失败 (S3Error): {str(e)}") + return False + except Exception as e: + log(f"删除文件失败: {str(e)}") + return False + + +def check_file_exists(bucket_name, object_name): + """ + 检查文件是否存在于 MiniIO + + Args: + bucket_name: 存储桶名称 + object_name: 对象名称(在 MiniIO 中的路径) + + Returns: + bool: 文件存在返回 True,不存在返回 False + """ + try: + client = miniIOClient() + + # 检查存储桶是否存在 + if not client.bucket_exists(bucket_name): + log(f"存储桶不存在: {bucket_name}") + return False + + # 检查对象是否存在 + try: + client.stat_object(bucket_name, object_name) + return True + except S3Error as e: + if e.code == 'NoSuchKey': + return False + else: + log(f"检查文件存在性时出错: {str(e)}") + return False + except S3Error as e: + log(f"检查文件存在性失败 (S3Error): {str(e)}") + return False + except Exception as e: + log(f"检查文件存在性失败: {str(e)}") + return False diff --git a/script/auto_sliceing_operate/utils/oss_func.py b/factory_sliceing/auto_sliceing_operate/utils/oss_func.py similarity index 100% rename from script/auto_sliceing_operate/utils/oss_func.py rename to factory_sliceing/auto_sliceing_operate/utils/oss_func.py diff --git a/script/auto_sliceing_operate/utils/oss_redis.py b/factory_sliceing/auto_sliceing_operate/utils/oss_redis.py similarity index 100% rename from script/auto_sliceing_operate/utils/oss_redis.py rename to factory_sliceing/auto_sliceing_operate/utils/oss_redis.py diff --git a/factory_sliceing/auto_sliceing_operate/utils/zip.py b/factory_sliceing/auto_sliceing_operate/utils/zip.py new file mode 100644 index 0000000..a684fc7 --- /dev/null +++ b/factory_sliceing/auto_sliceing_operate/utils/zip.py @@ -0,0 +1,69 @@ +import os,shutil +import zipfile +from logs import log + + +def zip_file(folderPath, outputZipPath=None): + """ + 压缩指定目录为zip文件 + + Args: + folderPath: 要压缩的目录路径 + outputZipPath: 输出的zip文件路径,如果为None则使用目录名+'.zip' + + Returns: + str: 生成的zip文件路径,如果失败返回None + """ + try: + if not os.path.exists(folderPath): + log(f"目录不存在: {folderPath}") + return None + + if not os.path.isdir(folderPath): + log(f"路径不是目录: {folderPath}") + return None + + # 如果没有指定输出路径,使用目录名+'.zip' + if outputZipPath is None: + folderName = os.path.basename(folderPath.rstrip(os.sep)) + parentDir = os.path.dirname(folderPath) + outputZipPath = os.path.join(parentDir, f"{folderName}.zip") + + log(f"开始压缩目录: {folderPath} -> {outputZipPath}") + + # 创建zip文件 + with zipfile.ZipFile(outputZipPath, 'w', zipfile.ZIP_DEFLATED) as zipf: + # 遍历目录中的所有文件 + for root, dirs, files in os.walk(folderPath): + # 计算相对路径 + # 如果root就是folderPath,相对路径为空 + # 否则计算相对于folderPath的路径 + if root == folderPath: + arcname_prefix = '' + else: + # 获取相对于folderPath的路径 + arcname_prefix = os.path.relpath(root, folderPath) + os.sep + + for filename in files: + file_path = os.path.join(root, filename) + # 在zip中的路径(相对路径) + arcname = arcname_prefix + filename + zipf.write(file_path, arcname) + log(f"已添加文件到压缩包: {arcname}") + + log(f"目录压缩完成: {outputZipPath}") + return outputZipPath + + except Exception as e: + log(f"压缩目录时出现错误: {str(e)}") + return None + + +# def uploadAndZip(folderPath): +# # 上传文件到oss +# # upload_file(folderPath) # 暂时注释,等待实现 +# # 压缩文件 +# zip_file(folderPath) + + +zip_file("/Users/dcx/code/make2/script/batchPrint/1","1024.zip") \ No newline at end of file diff --git a/script/factory_sliceing_v2/build_exe.bat b/factory_sliceing/download_batch_data/build_exe.bat similarity index 100% rename from script/factory_sliceing_v2/build_exe.bat rename to factory_sliceing/download_batch_data/build_exe.bat diff --git a/script/factory_sliceing_v2/build_exe.py b/factory_sliceing/download_batch_data/build_exe.py similarity index 100% rename from script/factory_sliceing_v2/build_exe.py rename to factory_sliceing/download_batch_data/build_exe.py diff --git a/script/factory_sliceing_v2/build_exe.spec b/factory_sliceing/download_batch_data/build_exe.spec similarity index 100% rename from script/factory_sliceing_v2/build_exe.spec rename to factory_sliceing/download_batch_data/build_exe.spec diff --git a/script/factory_sliceing_v2/dist/factory_sliceing.exe b/factory_sliceing/download_batch_data/dist/factory_sliceing.exe similarity index 100% rename from script/factory_sliceing_v2/dist/factory_sliceing.exe rename to factory_sliceing/download_batch_data/dist/factory_sliceing.exe diff --git a/script/factory_sliceing_v2/download.py b/factory_sliceing/download_batch_data/download.py similarity index 100% rename from script/factory_sliceing_v2/download.py rename to factory_sliceing/download_batch_data/download.py diff --git a/script/factory_sliceing_v2/main.py b/factory_sliceing/download_batch_data/main.py similarity index 100% rename from script/factory_sliceing_v2/main.py rename to factory_sliceing/download_batch_data/main.py diff --git a/script/factory_sliceing_v2/requirements.txt b/factory_sliceing/download_batch_data/requirements.txt similarity index 100% rename from script/factory_sliceing_v2/requirements.txt rename to factory_sliceing/download_batch_data/requirements.txt diff --git a/script/factory_sliceing_v2/utils/changeFiles.py b/factory_sliceing/download_batch_data/utils/changeFiles.py similarity index 100% rename from script/factory_sliceing_v2/utils/changeFiles.py rename to factory_sliceing/download_batch_data/utils/changeFiles.py diff --git a/script/factory_sliceing_v2/utils/funcs.py b/factory_sliceing/download_batch_data/utils/funcs.py similarity index 100% rename from script/factory_sliceing_v2/utils/funcs.py rename to factory_sliceing/download_batch_data/utils/funcs.py diff --git a/script/factory_sliceing_v2/utils/logs.py b/factory_sliceing/download_batch_data/utils/logs.py similarity index 100% rename from script/factory_sliceing_v2/utils/logs.py rename to factory_sliceing/download_batch_data/utils/logs.py diff --git a/script/factory_sliceing_v2/utils/oss_func.py b/factory_sliceing/download_batch_data/utils/oss_func.py similarity index 100% rename from script/factory_sliceing_v2/utils/oss_func.py rename to factory_sliceing/download_batch_data/utils/oss_func.py diff --git a/script/factory_sliceing_v2/utils/oss_redis.py b/factory_sliceing/download_batch_data/utils/oss_redis.py similarity index 100% rename from script/factory_sliceing_v2/utils/oss_redis.py rename to factory_sliceing/download_batch_data/utils/oss_redis.py diff --git a/script/factory_sliceing_v2/utils/small_machine_transform.py b/factory_sliceing/download_batch_data/utils/small_machine_transform.py similarity index 100% rename from script/factory_sliceing_v2/utils/small_machine_transform.py rename to factory_sliceing/download_batch_data/utils/small_machine_transform.py diff --git a/script/test.py b/script/test.py index 1bc3529..ad438aa 100644 --- a/script/test.py +++ b/script/test.py @@ -1,54 +1,13 @@ from pathlib import Path -import os -import shutil -# 指定要遍历的文件夹路径 -folder_path = Path('G://obj_fix/print') - -# 定义函数来递归遍历文件夹下的所有文件 -def list_files(directory): - for root, dirs, files in os.walk(directory): - for file in files: - yield os.path.join(root, file) - -# 指定要遍历的文件夹路径 -# folder_path = folder_path - -# 使用list_files函数来列出文件夹下的所有文件 -nums = 0 -for file_path in list_files(folder_path): - - if "around" in file_path: - continue - - - if "_new.obj" not in file_path: - continue - - - - - #提取pid - arrTemp = file_path.split('\\') - pid = arrTemp[len(arrTemp)-2] - - #判段是否存在 {pid}.obj 文件,存在的话就进行重命名 - initObjPath = f'G://obj_fix/print/{pid}/{pid}.obj' - if not os.path.exists(initObjPath): - continue - - #存在的话就重命名文件 - old_file_path = f'G://obj_fix/print/{pid}/{pid}_old.obj' - os.rename(initObjPath, old_file_path) - - - newObjfilePath = f'G://obj_fix/print/{pid}/{pid}_new.obj' - os.rename(newObjfilePath, initObjPath) - - # # 将 new.obj 文件复制到指定的文件夹下 G:\obj_fix\print\{pid}\ - - # source_obj = file_path - # target_obj = f'G://obj_fix/print/{pid}/{pid}_new.obj' - # print(f"当前正在处理{pid}") - # shutil.copy(source_obj, target_obj) - nums += 1 - print(pid,file_path,nums) +import requests,json,os + +objFilePath = "/Users/dcx/code/make2/script/factory_sliceing/batchPrint/45/data" +objCounts = 0 +for file in os.listdir(objFilePath): + print(file) + # if file == 'arrange': + # continue + if file.endswith('.obj'): + objCounts += 1 + +print(objCounts) \ No newline at end of file diff --git a/script/test1.py b/script/test1.py index 138954b..3fcd401 100644 --- a/script/test1.py +++ b/script/test1.py @@ -1,33 +1,24 @@ import os -import shutil +import requests -folder_path = 'G:\\obj_fix\print' +#向 https://lenovodata.blob.core.windows.net/secretdata/photos/1/photo2/92_2.jpg?se=2025-10-30T10%3A01%3A13Z&sig=bv2KAPuNkYT5%2B4tNVMo53kWKIoniQaDkog27AYAXm4s%3D&sp=rcw&spr=https&sr=b&st=2025-10-30T09%3A01%3A13Z&sv=2025-05-05 +# 上传图片 +def upload_image(image_path): + url = 'https://lenovodata.blob.core.windows.net/secretdata/photos/1/photo2/92_2.jpg?se=2025-10-30T10%3A01%3A13Z&sig=bv2KAPuNkYT5%2B4tNVMo53kWKIoniQaDkog27AYAXm4s%3D&sp=rcw&spr=https&sr=b&st=2025-10-30T09%3A01%3A13Z&sv=2025-05-05' + with open(image_path, 'rb') as f: + image_data = f.read() + headers = { + 'x-ms-blob-type': 'BlockBlob', + 'Content-Type': 'image/jpeg', + } + response = requests.put(url, data=image_data, headers=headers) + try: + response.raise_for_status() + except requests.HTTPError as e: + raise RuntimeError(f'上传失败 {response.status_code}: {response.text}') from e + return { + 'status_code': response.status_code, + 'etag': response.headers.get('ETag'), + } -# 遍历文件夹下的所有文件 -# 定义函数来递归遍历文件夹下的所有文件 -def list_files(directory): - for root, dirs, files in os.walk(directory): - for file in files: - yield os.path.join(root, file) - -nums = 0 -for file_path in list_files(folder_path): - if "_preview.png" not in file_path: - continue - print(file_path) - nums += 1 - # #提取pid - # arrTemp = file_path.split('\\') - # pid = arrTemp[len(arrTemp)-2] - - # #判断 G:\obj_fix\print\wrong\ 文件夹里 是否存在 {pid}_preview.png 文件 - - # filePath = f'G://obj_fix\print\wrong\{pid}_preview.png' - # #不存在跳过 - # if not os.path.exists(filePath): - # continue - - # #存在的话就重命名文件 - # new_file_path = f'G://obj_fix\print\wrong\{pid}_preview_already_right.png' - # os.rename(filePath, new_file_path) -print(nums) \ No newline at end of file +upload_image('273628Tex1.jpg') \ No newline at end of file