为什么Python不运行我的bash代码?

时间:2016-12-28 20:30:29

标签: python bash python-2.7 unit-testing

我正在尝试调试为测试集成而提供的一些单元测试。

我确定上次我在本地计算机上测试时效果很好,但这似乎已经改变了 - 文件没有被修改过,所以我不知道'从那以后改变了。

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

语法错误是:

  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中运行

1 个答案:

答案 0 :(得分:2)

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