cx_Freeze打包程序中subprocess调用exe触发argparse解析错误
解决subprocess调用cx_Freeze打包exe时的argparse解析错误
嘿,我瞅了下你的问题,大概率是subprocess传递参数的方式不对,这直接导致了程序B里的argparse解析失败。
问题出在哪?
你现在写的subprocess参数是这样的:
subprocess.run(["dummy_dist/dummy.exe", "--mode 1", "--pid " + str(os.getpid()), "--sid " + sid], cwd="dummy_dist")
这里的关键错误是:你把命令行选项和对应的值放在了同一个字符串里。比如--mode 1作为一个列表元素传递时,argparse会把整个字符串当成一个单独的、无法识别的参数——它根本不知道你是想传递--mode选项并附带上1这个值,自然会在parser.parse_args()这行炸锅。
怎么修复?
拆分参数为独立元素
把每个选项和它的值拆成列表里的单独项,同时调整下exe的路径(因为你已经设置了cwd="dummy_dist",当前工作目录会切换到这个文件夹,再写dummy_dist/dummy.exe就会变成嵌套路径,反而找不到文件)。修改后的代码应该是这样:subprocess.run( [ "dummy.exe", # 直接用文件名就行,cwd已经指向dummy_dist了 "--mode", "1", "--pid", str(os.getpid()), "--sid", sid ], cwd="dummy_dist" )用这种列表拆分的方式,subprocess会正确把每个参数传递给程序B,argparse就能正常识别
--mode、1这些独立的参数了。确认程序B的argparse定义没问题
你得保证程序B里的argparse配置和传递的参数匹配,比如:import argparse parser = argparse.ArgumentParser() parser.add_argument("--mode", type=int, required=True) # 对应--mode 1 parser.add_argument("--pid", type=int, required=True) # 对应--pid 你的进程ID parser.add_argument("--sid", type=str, required=True) # 对应--sid 你的sid值 args = parser.parse_args()要确保选项名称完全一致,类型也匹配(比如
mode设为int,传递的"1"会被自动转换,不用额外处理)。
额外排查小技巧
要是改完参数还是报错,你可以先手动测试程序B:
- 打开命令行,进入
dummy_dist文件夹,执行dummy.exe --mode 1 --pid 1234 --sid test_string,看能不能正常运行。如果手动运行都报错,那就是程序B本身的argparse或者打包有问题;如果手动没问题,那再回头检查subprocess的参数传递。
内容的提问来源于stack exchange,提问作者yhware
相关产品推荐
相关产品推荐

