这是我用Python编写代码的第一天,我在自动化方面有些艰难。我有一个程序(./main)通过输入重定向(“ ./main <1.txt”)接收.txt文件。我需要使用1000个不同的txt文件(从1.txt到1000.txt)运行它,并使用llvm将合并的代码覆盖率数据输出到文件coverage.txt中。在bash中,以下命令对两个文件成功执行:
clang++ -fprofile-instr-generate -fcoverage-mapping main.cpp -o main
-LLVM_PROFILE_FILE="1.profraw" ./main < 1.txt
-LLVM_PROFILE_FILE="2.profraw" ./main < 2.txt
llvm-profdata merge -sparse 1.profraw 2.profraw -o main.profdata
llvm-cov show ./main -instr-profile=main.profdata main.cpp > coverage.txt
我的目标是使用Python编写脚本并循环创建和合并所有.profraw文件。我尝试了以下方法的许多变体,但均未成功:
subprocess.call(["clang++", "-fprofile-instr-generate", "-fcoverage-mapping", "main.cpp", "-o", "main"])
i = 1
while i <= 1000:
inputFilename = str(i) + ".txt"
outputFilename = "\"" + str(i) + ".profraw\""
llvmCommand = "LLVM_PROFILE_FILE="
cmd = [llvmCommand, outputFilename, "./main", "<", inputFilename]
p = subprocess.Popen(cmd, shell=True)
p.communicate()
i += 1
我还没有进入合并步骤,因为这不会生成任何.profraw文件。在Spyder中或从终端运行时,它也不会生成任何错误消息。
预先感谢您的帮助;我知道这是基本知识,但是我花了数小时没有运气。
编辑:尝试Henk的方法:
i = 1
while i <= 1000:
inputFilename = ''.join([str(i), ".txt"])
outputFilename = ''.join(['"', str(i), '.profraw"'])
llvmCommand = ''.join(["LLVM_PROFILE_FILE=", outputFilename])
cmd = [llvmCommand, "./main", "<", inputFilename]
sp = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = sp.communicate()
i += 1
这是我收到的错误(即使当我硬编码绝对文件路径时):
FileNotFoundError: [Errno 2] No such file or directory:
'LLVM_PROFILE_FILE="1.profraw"': 'LLVM_PROFILE_FILE="1.profraw"'
答案 0 :(得分:2)
如果使用这种方法,则可以看到stdout和stderr中出了什么问题(如果有的话)。
sp = subprocess.Popen([executable, arg1, arg2], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = sp.communicate()