sys.argv 可以传递权重文件路径的核心原因在于它能够从命令行参数中动态获取外部输入的数据。以下是具体分析:
-
sys.argv 的核心功能
sys.argv 是 Python 的 sys 模块提供的一个列表变量,用于存储从命令行传递给脚本的所有参数。其中:
sys.argv[0] 是脚本本身的文件名或路径;sys.argv[1:] 是用户自定义的参数列表 。 例如,执行 python train.py --weights model.h5 时,sys.argv[1:] 会包含 [“–weights”, “model.h5”],而 sys.argv[2] 即为权重文件路径 “model.h5”。 -
权重文件路径传递的必要性
在机器学习或深度学习场景中,模型权重文件(如 .h5、.pt 文件)通常需要动态加载。例如:训练脚本可能需要指定预训练权重路径;推理脚本需要加载不同版本的权重进行测试。 通过 sys.argv 或类似工具(如 argparse)传递路径,可以避免硬编码路径到代码中,提升灵活性和可复用性。
3.操作系统与 Python 的参数交互机制
当在命令行运行脚本时,操作系统会将参数列表传递给 Python 解释器。sys.argv 作为接口,直接暴露这些参数。例如:
# 命令行输入
python inference.py /path/to/weights/model.h5
对应到 Python 中:
import sys
print(sys.argv) # 输出: ['inference.py', '/path/to/weights/model.h5']
weight_path = sys.argv[1] # 获取路径参数
这种机制使得用户可以通过字符串传递任意路径,Python 程序只需解析该字符串并验证路径有效性(如 os.path.exists(weight_path))即可 。
可以通过使用这个来代替
说一下为什么要这么干吧,主要是因为后面的方法如果打包为exe的话会有两个main入口,从而导致错误的打包,但是如果使用前者的方法的话,我们可以在export的main下面的部分定义为一个函数模块,然后主程序直接调用模块;可以参考下面重构为模块。
重构为模块调用
核心思路:将子脚本重构为模块函数,通过多线程或协程替代 QProcess,避免多进程调用。
实现步骤:
1.子脚本改造为模块
# sub_script1.py
def run():
print("子脚本逻辑")
if __name__ == "__main__":
run()
2.主程序直接调用模块
from sub_script1 import run
from PySide6.QtCore import QThread
class WorkerThread(QThread):
def run(self):
run() # 直接调用子脚本函数
thread = WorkerThread()
thread.start()
总结
sys.argv 能传递权重文件路径的本质是其作为命令行参数与 Python 程序的桥梁,通过字符串传递路径信息,再由程序解析并验证。这种方式简单高效,适用于需要动态配置文件路径的场景(如模型加载、数据处理等)