Windows 10下Python subprocess.Popen调用第三方Jar失败问题
问题解决
1. Timeout命令语法错误(Windows环境)
Windows的timeout命令语法和类Unix系统不同,你当前的写法['timeout', '30', 'java', ...]不符合Windows要求,正确的timeout需要通过/t参数指定时长。更推荐直接用Python的subprocess.Popen自带的超时机制,避免依赖系统命令:
try: p1 = subprocess.Popen(['java', '-jar', 'ccmcl.jar', '-A', 'my_text_file.txt', '-I', 'my_csv_file.csv', '-T', '3'], stdout=subprocess.PIPE) idc_acc_array_content, err = p1.communicate(timeout=30) except subprocess.TimeoutExpired: p1.kill() idc_acc_array_content, err = p1.communicate() # 按需添加超时后的处理逻辑
如果一定要用Windows的timeout命令,需调整为正确参数格式(注意启用shell=True,因为timeout是CMD内部命令):
p1 = subprocess.Popen('timeout /t 30 && java -jar ccmcl.jar -A my_text_file.txt -I my_csv_file.csv -T 3', stdout=subprocess.PIPE, shell=True) idc_acc_array_content, err = p1.communicate()
2. Java类缺失错误
报错NoClassDefFoundError: org/jfree/data/xy/XYDataset说明ccmcl.jar依赖JFreeChart类库,但该Jar并非包含所有依赖的独立可执行Jar(fat jar)。解决步骤:
- 找到该工具配套的
lib文件夹(仓库中应有提供),里面包含jfreechart.jar、jcommon.jar等依赖文件 - 将
lib文件夹放在ccmcl.jar同一目录下 - 修改Java执行命令,通过
-cp(classpath)参数指定所有依赖:
p1 = subprocess.Popen(['java', '-cp', 'ccmcl.jar;lib/*', 'gov.nist.combinatorics.ccmcl.Main'], stdout=subprocess.PIPE) idc_acc_array_content, err = p1.communicate()
(注:Windows下路径分隔符用;,类Unix系统用:)
关于“Jar是否开箱即用”的疑问
你的想法有误,这个ccmcl.jar并非开箱即用的独立可执行Jar,它依赖第三方类库,必须结合仓库提供的lib文件夹内的依赖文件才能正常运行。
内容的提问来源于stack exchange,提问作者kevkev9957
相关产品推荐
相关产品推荐

