Как запустить файл программы Python '__main__' из командной строки bash в Windows10? - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь запустить файл программы на python3 и получаю неожиданное поведение.

Сначала я начну со своей настройки PATH и env. Когда я бегу:

which Python

Я получаю:

/c/Program Files/Python36/python

Оттуда я cd в каталог, где находится моя программа на python, чтобы подготовиться к запуску программы.

Грубо говоря, так настроена моя программа на Python:

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

Вот ссылка на репозиторий с кодом, с которым я работаю, на случай, если вам захочется больше подробностей относительно реализации. Помните, что ключи API не публикуются, но ключи API находятся в локальном файле правильно:

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

Мой вопрос вращается вокруг того, почему мои 1-ые операторы отладки внутри файлов печатаются на терминал, а не 2-ые операторы отладки внутри функций?

Это происходит как в файле findRestaurant.py, так и в файле geocode.py.

Я знаю, что правильно написал свою точку входа в программу if __name__ == '__main__':, так как это точно так же, как я делал это для других программ, но в этом случае я могу упустить что-то, что не замечаю.

Если это мой вывод при запуске моей программы в терминале bash:

$ python findRestaurant.py
inside geo
inside find

тогда, почему кажется, что мой aFunctionNeeded() метод, показанный в моем псевдокоде, не вызывается из main ?

Почему обе программы, похоже, перестали работать сразу после того, как первые операторы отладки напечатаны на терминале?

findRestaurant.py Файл, который также можно найти по ссылке выше

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 Файл, который также можно найти по ссылке выше

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)

1 Ответ

0 голосов
/ 05 июля 2018

Причина, по которой вы не видите вывод более поздних частей вашего кода, состоит в том, что вы отбрасываете стандартные потоки вывода и ошибок с этими строками:

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

Я не совсем уверен, почему эти строки ломают вас, возможно, ваша консоль не ожидает utf8 закодированного вывода ... Но поскольку они не работают должным образом, вы ничего не видите из остальная часть кода, включая сообщения об ошибках, поскольку вы восстанавливаете поток stderr вместе с потоком stdout.

...