Python入坑之os.system()空格或中文乱码处理

今天发现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"

还是比较简单,但是花费了一两个小时处理,基础不行啊。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值