Python学习笔记之自动获取svn Info

在做一个小项目时,正好有需求要去获取指定目录的SVN相关信息,初始第一版code如下所示:

import os, re, traceback, subprocess, tempfile


def getSvnInfo(path):
    try:
        cur_path = os.getcwd()
        os.chdir(path)
        # 使用如下接口很方便的去获取SVN INFO相关信息
        rt = os.popen('svn info').read()
        os.chdir(cur_path)

    except Exception as e:
        print('str(Exception):', str(Exception))
        print('repr(e):', repr(e))
        print('traceback.format_exc(): %s' % traceback.format_exc())

    return rt


if __name__ == '__main__':
    print(getSvnInfo('./'))

获取的信息如下所示:

Path: .
Working Copy Root Path: I:\svn
URL: file:///H:/mysvn/pytools
Relative URL: ^/pytools
Repository Root: file:///H:/mysvn
Repository UUID: 060fed93-8902-9345-9e49-db05ad847e58
Revision: 79
Node Kind: directory
Schedule: normal
Last Changed Author: xsophiax
Last Changed Rev: 79
Last Changed Date: 2019-04-07 16:13:26 +0800 (周日, 07 四月 2019)

如上所述,使用Python直接执行是没有任何问题的,但是心细的同学发现返回的Result存在中文

此时放心的过滤,直接使用pyinstaller -F lesson_subprocess.py,直接运行则出现如下问题(汗一个):

查.......查... ...

太过简单的调用os.popen('svn info').read(),其返回的含有中文,则open时encoding则要采用‘gbk’呀;

这样岂不是不能这么快乐采用这种方式了... ...

查看源码,参照改一下,如下所示:

def getSvnInfo(path):

    try:
        cur_path = os.getcwd()

        os.chdir(path)

        with tempfile.TemporaryFile(mode='w+', encoding='gbk') as out_temp:
            fileno = out_temp.fileno()
            si = subprocess.STARTUPINFO()
            si.dwFlags |= subprocess.STARTF_USESHOWWINDOW
            p = subprocess.Popen('svn info', stdin=subprocess.DEVNULL, stdout=fileno, stderr=fileno, startupinfo=si)
            p.wait()

            out_temp.seek(0)
            rt = out_temp.read()

        os.chdir(cur_path)

        print(rt)

    except Exception as e:
        print('str(Exception):', str(Exception))
        print('repr(e):', repr(e))
        print('traceback.format_exc(): %s' % traceback.format_exc())

    return rt

这直接运行就能正常显示结果了,如下图所示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值