Code Review Stack Exchange is a question and answer site for peer programmer code reviews. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I try to get into Python and thought I build together my own IDE. Most of it consists of different addons for vim and changes in the vimrc (which of course I simply copied of google), but I also needed a way of executing the main.py file, even when I am working on some other file of the same project. So, since I learned bash scripting fairly recently, I thought I hack together a script doing that for me.

To be honest, it grew a lot longer than I'd have expected (and took much longer, too). I think I tried to give it a little more of a serious look (minus the one or other 'bloody' in error messages that should never show).

So, main question: Where can I streamline it and did I use totally 'hacky' solutions which I should definitely not use again?

### runpy ###

# Config #

# Config holds 4 options. Set them to one to activate them and set them 0 to deactivate them

# use Python Version 
# Choose 2 for python2 
# Choose 3 for python3
usePython=3

# Same Terminal 
# This starts python in the very terminal window where you run the command
# If you want to change this to an external terminal emulator, please also
# add the fitting attribute to pass along a command. E.g.: 'xterm -e
# Important: Leave the final apostrophe open
sameTerminal=1
useTerminal="osascript -e 'tell application \"Terminal\" to do script "

# Interactive Mode
# Adds the "-i" option to the python command.
interactiveMode=0

# This file
# When activated, the file you're specifing in your working path will be chosen. If not the application
# will look for a 'main.py' file. Hereby is assumed that the file is exactly named 'main.py' and 
# that it can be found in the same or the parent director. Sibling and subdirectories are ignored.
thisFile=0

# Declaring Variables
# Some Variables have already been declared in the config above.
workPath=""
usePython2=0
usePython3=0
mainPyFile=()
running=""

# Functions #

# Show Usage
showUsage () {
    printf "%s\n" "This script is desinged to be part of a vim based IDE for Python. It will have a few base assumptions." "Assumptions:" "  1. This script is started from within vim." "  2. You're sorting your scripts like this '/differentFolderWithProjects/mainFolderWithMainFile/SubFolderForAdditionalRessources'. If that's not your system, this script won't work." "" "Usage: runpy [args] {path}" "Options:" "  -2 Use Python2" "  -3 Use Python3" "  -t (thisFile) Run the file I am working on rather than the main.py file" "  -s Use the same Terminal rather than a new window. This option is broken right now, same window is set on standard. Don't use the -s switch, you will only get an error message and the script will end without running anything." "  -h Display this help screen and ends the script no matter what other attributes were given." 
}

# Switch on or off attributes function
switch () {
    switch=$1
    if [[ "$switch" -eq 0 ]]; then
            return 1
        elif [[ "$switch" -eq 1 ]]; then
        return 0
    else
        printf "%s\n" "How the fuck did you screw up this part of the script?" "Error in function Switch when passing attribute $switch."
    fi      
}

# Parsing for the main.py file
parseMainFile () {
    while read -r file; do
        if [[ -f $file ]]; then
            mainPyFile[${#mainPyFile[@]}]="$file"
        fi
    done <<< $(find $(dirname $workPath) -name *main.py -maxdepth 1)

    while read -r file; do
        if [[ -f $file ]]; then
            mainPyFile[${#mainPyFile[@]}]="$file"
        fi
    done <<< $(find $(dirname $workPath)/.. -name *main.py -maxdepth 1)

    if [[ "${#mainPyFile[@]}" -gt 1 ]]; then
        printf "%s\n" "We found ${#mainPyFile[@]} main.py files. Only one allowed." "main.py file locations:"
        while read -r file; do 
            printf "%s\n" "$file"
        done <<< ${mainPyFile[@]}
        exit 1
    elif [[ "${#mainPyFile[@]}" -eq 1 ]]; then
        workPath=${mainPyFile[0]}
    fi
}

# Running the file
run() {
    case $usePython in
        2)  running="python"
            ;;
        3)  running="python3"
            ;;
        *)  printf "%s\n" "How the bloody hell did you fuck this up right here?" "Error in function run"
            exit 1
            ;;  
    esac

    if (( $interactiveMode )); then
        running="$running -i"   
    fi

    running="$running $workPath"

    case $sameTerminal in
        0)  ### running="$useTerminal\"$running\"'"
            ### $running
            printf "%s\n" "The -s option is broken at the moment and might be fixed to a later point" "Might be not fixed at all and simply removed due to me finding http://mywiki.wooledge.org/BashFAQ/050." "Might be turned into different functions for the most common terminals." 
            exit 1
            ;;
        1)  $running
            ;;
    esac    
}
# Script #

while (( $# )); do
    attr=$1
    if [[ "$attr" == "-"* ]]; then
        while read -n1 char; do
            case $char in
                -|" "|"")   continue
                    ;;
                t)  switch "thisFile"
                    thisFile=$?
                    ;;
                i)  switch "interactiveMode"
                    interactiveMode=$?
                    ;;
                2)  switch "usePython2"
                    usePython2=$?
                    ;;
                3)  switch "usePython3"
                    usePython3=$?
                    ;;
                s)  switch "sameTerminal"
                    sameTerminal=$?
                    ;;
                h)  showUsage
                    exit 0
                    ;;
                *)  printf "%s\n" "" "Unknown Attribute: $char"
                    showUsage
                    exit 1
                    ;;
            esac            
        done <<< $attr

    elif [[ "$attr" == "/"*".py" ]] || [[ "$attr" == "./"*".py" ]]; then
        workPath="$attr"
        echo $workPath
    fi
    shift
done

# Check for Python Version
if [[ "$usePython2" -eq 1 ]] && [[ "$usePython3" -eq 1 ]]; then
    printf "%s\n" "You cannot use Python2 and Python3 simultaneously. Either use the -2 or the -3 option"
    showUsage
    exit 1
elif [[ "$usePython2" -eq 1 ]]; then
    usePython=2
elif [[ "$usePython3" -eq 1 ]]; then
    usePython=3
fi

# Check for if workPath is provided
    if [[ "$workPath" == "" ]]; then
        printf "%s\n" "No Python file found. Please make sure your python file is provided to the application and your python file has the suffix .py." "The easiest way of providing a the file and file path is by giving the % option while editing the file via vim (intended use of this script)"
        exit 1
    fi      

# Parse for the main.py file if the -t option is not given 
# It is assumed that the main.py file is in the same or the parent directory. Sibling or sub directories
# will be ignored
if [[ "$thisFile" -eq 0 ]]; then
    parseMainFile
fi
run

exit 0
share|improve this question

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Browse other questions tagged or ask your own question.