今天发现os.system()方法在传递参数时目标程序无法从参数中获取到正确的值。
此问题产生的原因大致有两个:
一是字符编码不一致导致,这个可以通过修改.py文件的编码来解决,在PyCharm的File->Settings->Editor->File Encodings设置页面可以修改响应的字符编码格式。
二是传递的参数或者路径中包含空格,导致解析的时候,包含空格的参数被分割为多个参数,导致目标程序解析错误。
如:
src_file_name = "..\icon\心率\app_1.bmp"
dst_file_name = "..\icon\心率\app_1.16"
cmd = "bmpSlim.exe " + src_file_name + " " + dst_file_name
print(cmd)
os.system(cmd)
当src_file_name和dst_file_name不包含空格时,上述代码执行结果正确
print(cmd)打印为:
bmpSlim.exe ..\icon\心率\app_1.bmp ..\icon\心率\app_1.16
当src_file_name与dst_file_name包含空格时,如:
src_file_name = "..\icon\表盘\app_1 - 副本.bmp"
dst_file_name = "..\icon\表盘\app_1 - 副本.16"
print(cmd)打印为:
bmpSlim.exe ..\icon\表盘\app_1 - 副本.bmp ..\icon\表盘\app_1 - 副本.16
paramster invalid except 2 but 6
目标程序期待两个参数,但却给他传递了6个参数。
其中目标程序片段为:
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
if ( args.length != 2 ){
System.err.println("paramster invalid except 2 but "+args.length);
}else
{
// todo something
}
实际上从print(cmd)的输出也可以看出, 参数部分通过空格,确实被分割成了6部分。
其实解决起来也比较容易,用双引号("")把参数引起来作为一个整体即可,在python中可以这样做:
cmd = str.format("%s \"%s\" \"%s\"" % ("bmpSlim.exe", src_file_name, dst_file_name))
print(cmd)
os.system(cmd)
用str的format方法,把参数行格式化,并用双引号包裹起来作为一个整体,需要注意的时双引号需要用转义字符处理。
经过上述处理之后,目标参数就正常了:
bmpSlim.exe "..\icon\表盘\app_1 - 副本.bmp" "..\icon\表盘\app_1 - 副本.16"
还是比较简单,但是花费了一两个小时处理,基础不行啊。