最近在做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
网友评论