2016-12-28 4 views
-6

Ich versuche einige Komponententests zu debuggen, die zum Testen einer Integration bereitgestellt wurden.Warum führt Python meinen Bash-Code nicht aus?

Ich bin sicher, dass das letzte Mal funktionierte ich es auf meinem lokalen Computer getestet, aber das scheint sich geändert zu haben - die Datei wurde nicht geändert, so dass ich nicht weiß, was sich seitdem geändert hat.

Ich habe die identifizierenden Kommentare entfernt und einige Namen aus den ursprünglichen Komponententests geändert, weil es proprietäre Software ist.

der Syntaxfehler:

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

Das vollständige Skript hier:

#!/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 

Das ist alles in Python wird ausgeführt 2.7

+9

Das sieht für mich nicht wie Python-Code aus. Python verwendet geschweifte Klammern nicht zum Umgeben eines Funktionskörpers. Die erste Zeile sagt '#!/Bin/bash'. Bist du sicher, dass dies kein Bash-Skript ist? – Kevin

+3

Folgendes vermute ich: OP erhält einen Python-Fehler, weil er versucht, diese Datei mit dem Python-Interpreter auszuführen. Wenn er sagt: "Ich bin mir sicher, das hat beim letzten Mal funktioniert, als ich es auf meinem lokalen Rechner getestet habe", dann ist es, weil er das letzte Mal, als er es getestet hat, es in bash lief. – Kevin

+1

Ahh ja: es kommt so vor, dass alle Aussagen davor auch Python korrekt sind! Komisch. – RemcoGerlich

Antwort

2

Dies ist ein Bash-Skript, kein Python Skript. Führen Sie es mit ./script_name.sh oder bash script_name.sh statt python script_name.sh.

+1

So wie es sich herausstellt, bin ich ein Idiot, der zu müde und gestresst war, um zu bemerken, dass ich versuchte, ein Shell-Skript in Python auszuführen. Danke für die Hilfe! ;) – Yoda

Verwandte Themen