2016-12-28 8 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 

これは、すべてこれはbashスクリプトではなく、PythonのではPython 2.7

+9

これは私にとってPythonコードのようには見えません。 Pythonは、関数本体を囲むために中括弧を使用しません。最初の行は '#!/ bin/bash'です。これはbashスクリプトではないと確信していますか? – Kevin

+3

ここに私が疑うことがあります:彼はPythonインタプリタを使ってこのファイルを実行しようとしているので、OPはPythonエラーを受けています。前回のテストでローカルマシンでテストしたことがあると確信しています。 – Kevin

+1

Ahhはい:その前にあるすべての文も正しいPythonです!面白い。 – RemcoGerlich

答えて

2

で実行されていますスクリプト。 python script_name.shの代わりに./script_name.shまたはbash script_name.shを使用して実行します。

+1

だから、私はあまりにも疲れていて、Pythonでシェルスクリプトを実行しようとしていたことに気を付けることを強調しているばかだ。助けてくれてありがとう! ;) – Yoda

関連する問題