如何在 Windows 10 中从 bash 提示符运行 python '__main__' 程序文件?
Posted
技术标签:
【中文标题】如何在 Windows 10 中从 bash 提示符运行 python \'__main__\' 程序文件?【英文标题】:How do I run python '__main__' program file from bash prompt in Windows10?如何在 Windows 10 中从 bash 提示符运行 python '__main__' 程序文件? 【发布时间】:2018-12-14 08:54:00 【问题描述】:我正在尝试运行 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
我的问题围绕着为什么文件中的第一个调试语句打印到终端,而不是函数中的第二个调试语句?
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)
【问题讨论】:
您可以尝试打印__name__
以查看它的设置。我没有仔细研究过这个,但如果你像python myprog.py
一样运行它,__name__
应该设置为'__main__'
您的代码示例中有语法错误。它根本无法运行:print
中没有结束撇号。
请提供minimal reproducible example。我们无法调试伪代码。
其他网站上的代码链接没有帮助。如果您需要帮助,请帮助我们通过创建适当的 minimal reproducible example 来帮助您
在链接代码中,您将在最后一个有效的print
语句之后立即重新绑定sys.stdout
和sys.stderr
。我怀疑您的其余代码 正在 在某种程度上工作,您只是看不到它的输出。尝试删除这些行,您应该会看到一些输出。我不确定是否会出现编码问题,但 mojibake 输出可能总比没有好,至少对于调试而言。
【参考方案1】:
您没有看到代码后面部分的输出的原因是您已经使用这些行重新绑定了标准输出和错误流:
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
sys.stderr = codecs.getwriter('utf8')(sys.stderr)
我不确定为什么这些行会破坏你的东西,也许你的控制台不期望utf8
编码输出......但是因为它们没有按预期工作,你没有看到任何来自其余代码,包括错误消息,因为您将 stderr
流与 stdout
流一起反弹。
【讨论】:
以上是关于如何在 Windows 10 中从 bash 提示符运行 python '__main__' 程序文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 MAC 机器中从命令提示符启动 Appium 服务器?
在 Windows 命令提示符下检测到 BigQuery,但在 Bash 上未检测到