美文网首页
python popen及json的使用

python popen及json的使用

作者: jayhe | 来源:发表于2020-05-29 18:23 被阅读0次

    最近在做shell脚本迁移到python的工作,在做自动修改iOS打包的buildNumber的时候,用到了需要从接收命令行返回的结果,以及json文件的操作等,在此记录下

    自动修改build号的实现可以参照该文章Jenkins打包iOS自动修改build号

    接收shell命令行执行的结果

    • shell命令如下:
    BuildNumber=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "${PlistDir}")
    
    • 翻译成python
    buildNumberFP = os.popen('/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "%s"' %plistDir)
    global buildNumber
    buildNumber = buildNumberFP.read()
    buildNumber = buildNumber.replace('\n', '')
    
    • popen的实现
    def popen(cmd, mode="r", buffering=-1):
        if not isinstance(cmd, str):
            raise TypeError("invalid cmd type (%s, expected string)" % type(cmd))
        if mode not in ("r", "w"):
            raise ValueError("invalid mode %r" % mode)
        if buffering == 0 or buffering is None:
            raise ValueError("popen() does not support unbuffered streams")
        import subprocess, io
        if mode == "r":
            proc = subprocess.Popen(cmd,
                                    shell=True,
                                    stdout=subprocess.PIPE,
                                    bufsize=buffering)
            return _wrap_close(io.TextIOWrapper(proc.stdout), proc)
        else:
            proc = subprocess.Popen(cmd,
                                    shell=True,
                                    stdin=subprocess.PIPE,
                                    bufsize=buffering)
            return _wrap_close(io.TextIOWrapper(proc.stdin), proc)
    
    • 函数说明
    • popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令。
    • 参数type可使用“r”代表读取,“w”代表写入。依照此type值,popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。随后进程便可利用此文件指针来读取子进程的输出设备或是写入到子进程的标准输入设备中。

    json文件的读写

    json的写入文件

    • shell命令如下:
    echo "{\"BuildNumber\":\"${BuildNumber}\", \"BuildVersion\":\"${BuildVersion}\"}" > ${BuildJsonPath}
    
    • python命令
    infoDict = {"BuildNumber" : buildNumber, "BuildVersion" : buildVersion}
    with open(buildJsonPath, "w") as fp:
         json.dump(infoDict, fp)
    
    • open() 函数

    • open() 函数用于打开一个文件,创建一个 file 对象,相关的方法才可以调用它进行读写;buildJsonPath表示文件的路径、"w"表示打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件;

    • 如果是想追加写入用"a+"具体可参照Python open() 函数

    • json.dump函数

      • 图片.png
      • 就是将obj以json的格式写入到fp中,内部调用的是write()方法

    json的读取

    • shell命令如下:
      这里用了一个工具jq
    preBuildVersion=`cat ${BuildJsonPath} | jq -r ".BuildVersion"`
    
    • python命令
    with open(buildJsonPath, 'r') as fp:
         infoDict = json.load(fp)
         print(infoDict)
    global preBuildVersion
    preBuildVersion = infoDict['BuildVersion']
    
    • 函数解释
    • open函数的"r"参数表示以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    • json.load(fp)将已编码的 JSON 字符串解码为 Python 对象


      图片.png

    参考文档

    相关文章

      网友评论

          本文标题:python popen及json的使用

          本文链接:https://www.haomeiwen.com/subject/iaefzhtx.html