我正在编写一个python脚本,用于持续集成和测试,将被bitten调用。我们的单元测试使用谷歌测试框架。每个软件组件都有一个bash脚本,用于运行配置和其他所需服务,并运行gtest可执行文件。 python脚本遍历存储库以查找bash脚本,并使用os.popen()命令调用每个脚本。
Python脚本(UnitTest.py)
#!/usr/bin/python
import os
import fnmatch
import sys
import subprocess
repository_location = '/home/actuv/workspace/eclipse/iccs/'
unit_test_script_name = 'RunUnitTests.sh'
def file_locator(repo, script_name):
# Function for determining all unit test scripts
test_location = []
for root, dirnames, filenames in os.walk(repo):
for filename in fnmatch.filter(filenames, script_name):
test_location.append(os.path.join(root))
return test_location
def run_tests(test_locations, script_name):
# Runs test scripts located at each test location
for tests in test_locations:
cmd = 'cd ' + tests + ';./' + script_name
print 'Running Unit Test at: ' + tests
os.popen(cmd)
################ MAIN ################
# Find Test Locations
script_locations = file_locator(repository_location, unit_test_script_name)
# Run tests located at each location
run_tests(script_locations)
# End of tests
sys.exit(0)
Bash脚本
#!/bin/sh
echo "Running unit tests..."
# update the LD_LIBRARY_PATH to include paths to our shared libraries
# start the test server
# Run the tests
# wait to allow all processes to end before terminating the server
sleep 10s
当我从终端窗口手动运行bash脚本时,它运行正常。当我让python脚本调用bash脚本时,我在bash脚本的TestSingleClient和TestMultiClientLA行上出现了分段错误。
答案 0 :(得分:2)
尝试替换
os.popen(cmd)
带
proc = subprocess.Popen('./scriptname', shell = True,
cwd = tests)
proc.communicate()
答案 1 :(得分:1)
绝对查看subprocess模块 - 具体看一下 subprocess.call()便捷方法。我进行了os.path检查以确保您的测试目录也存在。
def run_tests(test_locations, script_name):
# Runs test scripts located at each test location
for tests in test_locations:
# Make sure tests directory exists and is a dir
if os.path.isdir(tests):
print 'Running Unit Test at: ' + tests
subprocess.call(script_name, shell=True, cwd=tests)
另外 - 你对stdout和stderr导致问题的观察是正确的,特别是当有大量数据时。当存在大量或未知量的输出时,我将临时文件用于stdout / stderr 实施例
def execute_some_command(cmd="arbitrary_exe"):
""" Execute some command using subprocess.call()"""
# open/create temportary file for stdout
tmp_out=file('.tmp','w+')
# Run command, pushing stdout to tmp_out file handle
retcode = subprocess.call(cmd, stdout=tmp_out, shell=True)
if retcode != 0:
# do something useful (like bailout) based on the OS return code
print "FAILED"
# Flush any queued data
tmp_out.flush()
# Jump to the beginning
tmp_out.seek(0)
# Parse output
for line in tmp_out.readlines():
# do something useful with output
# cleanup
tmp_out.close()
os.remove(_out.name)
return
查看python file对象上的方法,了解如何处理来自 _out 文件句柄的stdout数据。
好狩猎。