Why is my python function being skipped?
Question: I've got a small script that's trying to execute an external command. But for
some reason, the function that I made to execute the command is being
completely skipped over! No errors seem to be raised, it just doesn't execute.
I've got a few debug print statements inside it to verify that the function
gets entered, but they never print. And I've got a print statement outside of
it to verify that the script isn't dying. So what gives?

    
    
    from xml.etree import ElementTree as et
    import subprocess
    
    pomFileLocation = "pom.xml"
    uiAutomationCommand = "mvn clean install"
    revertPomFileCommand = "git checkout pom.xml"
    profileToSetToDefault = "smoketest"
    
    def modifyxml( datafile, value ):
        print( "modifying " + datafile )
        tree = et.parse( datafile )
        rootNodes = tree.getroot()
        for node in rootNodes:
            if "profiles" in node.tag:
                for profile in node.iter():
                    foundIt = False
                    for param in profile.iter():
                        if "id" in param.tag and profileToSetToDefault in param.text:
                            foundIt = True
                            break
                    if foundIt == True:
                        for param in profile.iter():
                            if "activation" in param.tag:
                                for child in param.iter():
                                    if "activeByDefault" in child.tag:
                                        child.text = value
                                        tree.write( datafile )
                                        return
    
    def runExternalCommand( comm ):
        print( "running command " + comm )
        p = subprocess.Popen( comm, bufsize=-1, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE ).communicate()[0]
        print( str(p) )
        while( True ):
            print( "still running" )
            retcode = p.poll()
            line = p.stdout.readline()
            yield line
            if( retcode is not None ):
                print("Exiting")
                break   
        return
    
    if __name__ == '__main__':
        modifyxml( pomFileLocation, "true" )
        #runExternalCommand( uiAutomationCommand )
        runExternalCommand( revertPomFileCommand )
        print( "finished" )
    


Answer: `runExternalCommand` uses `yield`, so if you want it to execute all the way to
the end, you ought to call it like `for something in
runExternalCommand(revertPomFileCommand):`. Or just delete the `yield` line,
since you don't seem to need it anyway.

    
    
    def runExternalCommand( comm ):
        print( "running command " + comm )
        p = subprocess.Popen( comm, bufsize=-1, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE ).communicate()[0]
        print( str(p) )
        while( True ):
            print( "still running" )
            retcode = p.poll()
            line = p.stdout.readline()
            yield line
            if( retcode is not None ):
                print("Exiting")
                break   
        return
    
    if __name__ == '__main__':
        modifyxml( pomFileLocation, "true" )
        #runExternalCommand( uiAutomationCommand )
        for line in runExternalCommand( revertPomFileCommand ):
            pass
        print( "finished" )
    

Or

    
    
    def runExternalCommand( comm ):
        print( "running command " + comm )
        p = subprocess.Popen( comm, bufsize=-1, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE ).communicate()[0]
        print( str(p) )
        while( True ):
            print( "still running" )
            retcode = p.poll()
            line = p.stdout.readline()
            if( retcode is not None ):
                print("Exiting")
                break   
        return
    
    if __name__ == '__main__':
        modifyxml( pomFileLocation, "true" )
        #runExternalCommand( uiAutomationCommand )
        runExternalCommand( revertPomFileCommand )
        print( "finished" )
    

