0

I am trying to run a python3 program file and am getting some unexpected behaviors.

I'll start off first with my PATH and env setup configuration. When I run:

which Python

I get:

/c/Program Files/Python36/python

From there, I cd into the directory where my python program is located to prepare to run the program.

Roughly speaking this is how my python program is set up:

import modulesNeeded

print('1st debug statement to show program execution')

# variables declared as needed

def aFunctionNeeded():
    print('2nd debug statement to show fxn exe, never prints')
    ... function logic...

if __name__ == '__main__':
    aFunctionNeeded() # Never gets called

Here is a link to the repository with the code I am working with in case you would like more details as to the implementation. Keep in mind that API keys are not published, but API keys are in local file correctly:

https://github.com/lopezdp/API.Mashups

My question revolves around why my 1st debug statements inside the files are printing to the terminal, but not the 2nd debug statements inside the functions?

This is happening in both of the findRestaurant.py file and the geocode.py file.

I know I have written my if __name__ == '__main__': program entry point correctly as this is the same exact way I have done it for other programs, but in this case I may be missing something that I am not noticing.

If this is my output when I run my program in my bash terminal:

$ python findRestaurant.py
inside geo
inside find

then, why does it appear that my aFunctionNeeded() method shown in my pseudo code is not being called from the main?

Why do both programs seem to fail immediately after the first debug statements are printed to the terminal?

findRestaurant.py File that can also be found in link above

from geocode import getGeocodeLocation
import json
import httplib2

import sys
import codecs

print('inside find')

sys.stdout = codecs.getwriter('utf8')(sys.stdout)
sys.stderr = codecs.getwriter('utf8')(sys.stderr)

foursquare_client_id = "..."
foursquare_client_secret = "..."


def findARestaurant(mealType,location):
    print('inside findFxn')
    #1. Use getGeocodeLocation to get the latitude and longitude coordinates of the location string.
    latitude, longitude = getGeocodeLocation(location)
    #2.  Use foursquare API to find a nearby restaurant with the latitude, longitude, and mealType strings.
    #HINT: format for url will be something like https://api.foursquare.com/v2/venues/search?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&v=20130815&ll=40.7,-74&query=sushi
    url = ('https://api.foursquare.com/v2/venues/search?client_id=%s&client_secret=%s&v=20130815&ll=%s,%s&query=%s' % (foursquare_client_id, foursquare_client_secret,latitude,longitude,mealType))
    h = httplib2.Http()
    result = json.loads(h.request(url,'GET')[1])

    if result['response']['venues']:
        #3.  Grab the first restaurant
        restaurant = result['response']['venues'][0]
        venue_id = restaurant['id']
        restaurant_name = restaurant['name']
        restaurant_address = restaurant['location']['formattedAddress']
        address = ""
        for i in restaurant_address:
            address += i + " "
        restaurant_address = address
        #4.  Get a  300x300 picture of the restaurant using the venue_id (you can change this by altering the 300x300 value in the URL or replacing it with 'orginal' to get the original picture
        url = ('https://api.foursquare.com/v2/venues/%s/photos?client_id=%s&v=20150603&client_secret=%s' % ((venue_id,foursquare_client_id,foursquare_client_secret)))
        result = json.loads(h.request(url, 'GET')[1])
        #5.  Grab the first image
        if result['response']['photos']['items']:
            firstpic = result['response']['photos']['items'][0]
            prefix = firstpic['prefix']
            suffix = firstpic['suffix']
            imageURL = prefix + "300x300" + suffix
        else:
            #6.  if no image available, insert default image url
            imageURL = "http://pixabay.com/get/8926af5eb597ca51ca4c/1433440765/cheeseburger-34314_1280.png?direct"
        #7.  return a dictionary containing the restaurant name, address, and image url
        restaurantInfo = {'name':restaurant_name, 'address':restaurant_address, 'image':imageURL}
        print ("Restaurant Name: %s" % restaurantInfo['name'])
        print ("Restaurant Address: %s" % restaurantInfo['address'])
        print ("Image: %s \n" % restaurantInfo['image'])
        return restaurantInfo
    else:
        print ("No Restaurants Found for %s" % location)
        return "No Restaurants Found"

if __name__ == '__main__':
    findARestaurant("Pizza", "Tokyo, Japan")

geocode.py File that can also be found in link above

import httplib2
import json

print('inside geo')

def getGeocodeLocation(inputString):
    print('inside of geoFxn')
    # Use Google Maps to convert a location into Latitute/Longitute coordinates
    # FORMAT: https://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&key=API_KEY
    google_api_key = "..."
    locationString = inputString.replace(" ", "+")
    url = ('https://maps.googleapis.com/maps/api/geocode/json?address=%s&key=%s' % (locationString, google_api_key))
    h = httplib2.Http()
    result = json.loads(h.request(url,'GET')[1])
    latitude = result['results'][0]['geometry']['location']['lat']
    longitude = result['results'][0]['geometry']['location']['lng']
    return (latitude,longitude)
14
  • 2
    You could try printing __name__ to see what it's set to. I haven't looked at this that closely, but if you're running it like python myprog.py, __name__ should be set to '__main__' Commented Jul 5, 2018 at 19:38
  • 2
    You have syntax error in your code example. It cannot be run at all: there is no closing apostrophe in print. Commented Jul 5, 2018 at 19:38
  • 2
    Please provide a minimal reproducible example. We can't debug pseudocode. Commented Jul 5, 2018 at 19:39
  • 1
    Links to code on another site aren't helpful. If you want help, help us help you by creating a proper minimal reproducible example Commented Jul 5, 2018 at 19:46
  • 1
    In the linked code, you're rebinding sys.stdout and sys.stderr immediately after the last print statement that works. I suspect the rest of your code is working to some degree, you're just not seeing its output. Try removing those lines and you should see some output. I'm not sure if there will be encoding issues or not, but mojibake output is probably better than nothing, at least for debugging. Commented Jul 5, 2018 at 19:46

1 Answer 1

4

The reason you're not seeing the output of the later parts of your code is that you've rebound the standard output and error streams with these lines:

sys.stdout = codecs.getwriter('utf8')(sys.stdout)
sys.stderr = codecs.getwriter('utf8')(sys.stderr)

I'm not exactly sure why those lines are breaking things for you, perhaps your console does not expect utf8 encoded output... But because they don't work as intended, you're not seeing anything from the rest of your code, including error messages, since you rebound the stderr stream along with the stdout stream.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.