通过python批量编译python源代码并json包装输出结果

一、获得指定路径下的.py

1.遍历的关键函数

os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])

参数

    top -- 是你所要遍历的目录的地址, 返回的是一个三元组(root,dirs,files)。
        root 所指的是当前正在遍历的这个文件夹的本身的地址
        dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
        files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)

    topdown --可选,为 True,则优先遍历 top 目录,否则优先遍历 top 的子目录(默认为开启)。如果 topdown 参数为 True,walk 会遍历top文件夹,与top 文件夹中每一个子目录。

    onerror -- 可选,需要一个 callable 对象,当 walk 需要异常时,会调用。

    followlinks -- 可选,如果为 True,则会遍历目录下的快捷方式(linux 下是软连接 symbolic link )实际所指的目录(默认关闭),如果为 False,则优先遍历 top 的子目录。

2.完整的遍历方法

def GetFileFromThisRootDir(dir, ext='py'):

    all_files = []

    needExtFilter = (ext is not None)

    for root, dirs, files in os.walk(dir):

        for files_path in files:

            file_path = os.path.join(root, files_path)
            extension = os.path.splitext(file_path)[1][1:]

            if extension == ext and needExtFilter:

                all_files.append(file_path)

            elif not needExtFilter:

                all_files.append(file_path)

    return all_files

二、编译运行并输出

1.编译的关键函数

EXEC = sys.executable # python编译器位置
fpath #编译的文件的路径

output = subprocess.check_output([EXEC, fpath]
注意这里的output并不是string,需要用到decode()解码

2.完整的过程

# 获取python版本
def get_version():

    v = sys.version_info

    version = "python %s.%s" % (v.major, v.minor)

    return version


# 编码
def decode(s):
    try:
        return s.decode('utf-8')

    except UnicodeDecodeError:

        return s.decode('gbk')

def compile_main(fpath):

    r = dict()
    r["version"] = get_version()

    try:

        # subprocess.check_output 是 父进程等待子进程完成,返回子进程向标准输出的输出结果
        # stderr是标准输出的类型
        outdata = decode(subprocess.check_output([EXEC, fpath], stderr=subprocess.STDOUT, timeout=5))

    except subprocess.CalledProcessError as e:

        # e.output是错误信息标准输出
        # 错误返回的数据
        print(decode(e.output))
        r["code"] = 'Error'
        r["output"] = decode(e.output)
        return r

    else:

        # 成功返回的数据
        r['output'] = outdata
        r["code"] = "Success"
        return r

运行结果
在这里插入图片描述

三、遇到的问题

1.结果放在json格式

输出的结果一旦放在json格式中,就没有办法解释转义字符,考虑到接下来的对接,于是最终放弃了json格式,用print的方式输出作为结果

2.python语言的特性

由于使用的的方法是subprocess.check_output实际上是一个执行子进程的过程,而且python作为解释型语言,虽然在重用的时候会编译出.pyc,但是大部分情况下还是会直接运行,因此一旦遇到需要输入时就无法继续执行了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值