2016-12-28 88 views
-6

我正在尝试调试一些为测试集成提供的单元测试。为什么Python不运行我的bash代码?

我确定这是最后一次工作,我在我的本地机器上测试过,但似乎已经改变 - 文件没有改变,所以我不知道自那时起有什么改变。

我已经删除了识别注释,并从原始单元测试中更改了一些名称,因为它是专有软件。

的语法错误是:

File "unitTests.sh", line 39 
    gLastFullPath=`python -c "import os; print os.path.realpath('${1}')"` 
       ^
SyntaxError: invalid syntax 

完整的脚本是在这里:

#!/bin/bash 

# If non-zero, then run in debug mode, outputting debug information 
debug=0 

# Set the following to 1 to force an error for testing purposes 
forceError=0 

separator="====================================================================================================" 

#------------------------------------------------------------------------------- 
# Convert the specified path to a full path and return it in the gLastFullPath 
# global variable. 
# 
# Input params: 
# $1 - Path to convert to full 
# 
# Output params: 
# $gLastFullPath - Set to the converted full path 
gLastFullPath="" 
getFullPath() 
{ 
    # Use Python (because it's easier than Bash) to convert the passed path to 
    # a full path. 
    gLastFullPath=`python -c "import os; print os.path.realpath('${1}')"` 
} 

#------------------------------------------------------------------------------- 
fatalError() 
{ 
    echo "${separator}" 
    echo "Fatal Error: $1" 
    echo "${separator}" 
    exit 1 
} 

#------------------------------------------------------------------------------- 
# If a file or folder exists at the specified path, then delete it. If it's a 
# directory, then its entire contents is deleted. 
#------------------------------------------------------------------------------- 
deleteIfExists() 
{ 
    if [[ 0 -ne $debug ]]; then 
     echo "deleteIfExists called..." 
    fi 

    if [[ -e "$1" ]]; then 
     # If it's a directory, then make sure it contains no locked files 
     if [[ -d "$1" ]]; then 
      chflags -R nouchg "$1" 
     fi 

     if [[ 0 -ne $debug ]]; then 
      echo " Deleting the existing file or directory:" 
      echo " $1" 
     fi 

     # Do the remove and check for an error. 
     /bin/rm -rf "$1" 
     if [[ $? -ne 0 ]]; then 
      fatalError "Unable to delete $1." 
     fi 
    fi 

    if [[ 0 -ne $debug ]]; then 
     echo 
    fi 
} 


#------------------------------------------------------------------------------- 
# Script starts here 
#------------------------------------------------------------------------------- 

# Get the full path to this script 
scriptPath=`which "$0"` 
getFullPath "${scriptPath}" 
scriptFullPath="${gLastFullPath}" 
scriptDir=`dirname "${scriptFullPath}"` 
scriptName=`basename "${scriptFullPath}"` 

if [[ 0 -ne $debug ]]; then 
    echo "$scriptName: Debug tracing is on." 
    echo 
fi 

# Get the SDK project root path 
getFullPath "${scriptDir}/.." 
projRoot="${gLastFullPath}" 

# Get the top of the server tree 
getFullPath "${projRoot}/SUBSYS_TOP" 
subsysTop="${gLastFullPath}" 

libPythonBase="${projRoot}/src/lib/py/devilsoftPy" 
devilsoftPython="${libPythonBase}/devilsoftpy" 

if [[ 0 -ne $debug ]]; then 
    echo "$scriptName: Project root dir:  \"${projRoot}\"" 
    echo "$scriptName: SUBSYS_TOP:   \"${subsysTop}\"" 
    echo "$scriptName: Lib python base:  \"${libPythonBase}\"" 
    echo "$scriptName: devilsoft python: \"${devilsoftPython}\"" 
    echo 
fi 

# First we have to launch the test python server. This is used by some of the other client tests to 
# run against. 
testServer="${devilsoftPython}/test/TestServer.py" 
if [[ ! -f "${testServer}" ]]; then 
    fatalError "Could not find the expected test server: \"${testServer}\"" 
fi 

# Carve out a place for our test server log file 
tempFolder="/tmp/devilsoft" 
mkdir -p "${tempFolder}" 
testServerLogFile="${tempFolder}/TestServer.log" 

echo "Starting the test server: \"${testServer}\"" 
echo " Logging to this file: \"${testServerLogFile}\"" 
export PYTHONPATH="${libPythonBase}:${PYTHONPATH}"; "${testServer}" > "${testServerLogFile}" 2>&1 & 
testServerPid=$! 
echo " Server started with pid ${testServerPid}..." 
echo 

echo " Taking a little snooze to let the test server initialize..." 
sleep 2 

# If we're forcing errors for testing, then kill the test server. This will cause downstream scripts 
# to fail because there will be no server to talk to. 
if [[ $forceError -ne 0 ]]; then 
    echo "Forcing downstream errors by killing the test server..." 
    kill ${testServerPid} 
    wait ${testServerPid} 
    testServerPid=0 
    echo 
fi 

testResultsLogFile="${tempFolder}/TestResults.log" 
echo "Testing each python script in the library..." 
echo " Test results will be written to this log file: \"${testResultsLogFile}\"" 
echo 
deleteIfExists "${testResultsLogFile}" 

# Save and set the field separator so that we can handle spaces in paths 
SAVEIFS=$IFS 
IFS=$'\n' 

failedScripts=() 
lastError=0 
pythonSources=($(find "${devilsoftPython}" -name '*.py' ! -name '*.svn*' ! -name '__init__.py' ! -name 'TestServer.py' ! -name 'ServerClient.py')) 
for pythonSourceFile in ${pythonSources[*]}; do 
    echo " Testing python source \"${pythonSourceFile}\"" 
    export PYTHONPATH="${libPythonBase}:${PYTHONPATH}"; "${pythonSourceFile}" >> "${testResultsLogFile}" 2>&1 
    result=$? 
    if [[ $result -ne 0 ]]; then 
     pythonSourceName=`basename "${pythonSourceFile}"` 
     echo " Error ${result} returned from the above script ${pythonSourceName}!" 
     lastError=${result} 
     failedScripts+=("${pythonSourceFile}") 
    fi 
done 
echo 

# Restore the original field separator 
IFS=$SAVEIFS 

if [[ ${testServerPid} -ne 0 ]]; then 
    echo "Telling the test server to quit..." 
    kill ${testServerPid} 
    wait ${testServerPid} 
    echo 
fi 

# If we got an error, tell the user 
if [[ $lastError -ne 0 ]]; then 
    echo "IMPORTANT! The following scripts failed with errors:" 
    for failedScript in "${failedScripts[@]}"; do 
     echo " \"${failedScript}\"" 
    done 
    echo 

    fatalError "Review the log files to figure out why the above scripts failed." 
fi 

echo "${separator}" 
echo " Hurray! All tests passed!" 
echo "${separator}" 
echo 

exit 0 

这一切正在在Python运行2.7

+9

这看起来不像我的Python代码。 Python不使用大括号来包围函数体。第一行说'#!/ bin/bash'。你确定这不是一个bash脚本吗? – Kevin

+3

下面是我怀疑的:OP正在得到一个Python错误,因为他试图使用Python解释器来运行这个文件。当他说“我确定这个工作是上次我在本地机器上测试过的”时,这是因为上次他测试它时,他用bash来运行它。 – Kevin

+1

Ahh yes:它恰好在它之前的所有语句都是正确的Python!滑稽。 – RemcoGerlich

回答

2

这是一个bash脚本,而不是一个Python脚本。使用./script_name.shbash script_name.sh而不是python script_name.sh运行它。

+1

所以,事实证明,我是个笨蛋,他太累了,并且强调要注意我正试图在Python中运行shell脚本。感谢您的协助! ;) – Yoda

相关问题