以查询预测国内各地天气和pm值里的程序为例,代码保存为weatherPM.py(附在帖子最后),有一个查询城市代码的支持文件city.json。用pyinstaller将weatherPM.py打包成可执行文件夹。
- 先将命令/终端窗口调出来:Windows通过cmd调出的命令窗口;Mac用commoand + 空格调出搜索栏,搜索栏里输入terminal调出terminal窗口。
- 在命令/终端窗口上输入pyinstaller时,可以明确指出py的路径。
Mac: pyinstaller /users/PythonABC/Documents/python/weatherPM.py
Windows:pyinstaller “C:\Documents and Settings\python\weatherPM.py”
- 也可以先进入py所在的文件夹再输入命令, 直接输入pyinstaller weatherPM.py或者pyinstaller -D weatherPM.py,见图:
pyinstaller打包会在weatherPM.py所在文件夹下生成一个weatherPM.spec文件。之前没有build和dist这两个文件夹的就再建立两个文件夹build和dist,已经有了这两个文件夹就使用已经建好的文件夹。
weatherPM.spec是打包的参数设定文件,必要时可以修改。build文件夹存放打包过程中产生的日志和一些工作文件。dist是英文distribute分发的前四个字母,意指里面的内容是可以分发给用户使用的。dist文件里面是打包好了可执行文件夹。
如果先后用pyinstaller对weatherPM.py和locateIP.py进行打包,这dist文件夹里会有weatherPM和locateIP两个可执行文件夹。weatherPM可执行文件(Mac)或weatherPM.exe(Windows)到dist下的weatherPM文件夹可以找得到,双击运行。发送给用户时要把整个weatherPM文件夹发给用户。升级代码时,如果引用的第三方模块和依托文件都不变,则只需把升级后的代码重新生成的可执行文件weatherPM(Mac)或weatherPM.exe(Windows)发送给用户即可, weatherPM文件夹下的其他文件不必重新发送。
# 天气查询预报和PM值-----weatherPM.py
import json
import requests
from datetime import datetime
city_list_location = '/Users/PythonABC/Documents/python/city.json'
# json在线上获取的城市数据文件存放的位置+文件名字串,这里用了代表当前文件夹的'。'
# 到城市数据文件city.json中查找用户输入的城市名,获得城市代码
def get_city_ID(city_name): # 形参接收城市名
with open(city_list_location, encoding='utf-8') as city_file:
city_str = city_file.read()
city_list = json.loads(city_str)
for city in city_list:
if city['city_name'] == city_name:
return city['city_code'] # 返回城市代码
# 按网站要求拼接好请求数据的链接
def url_name(city_name):
findCityID = get_city_ID(city_name)
if findCityID is not None:
api = 'http://t.weather.sojson.com/api/weather/city/'
full_url = api + get_city_ID(city_name)
return full_url
else:
return None # 没找到城市对应的城市代码
while True:
print('\n{:=^40}'.format('欢迎进入天气查询系统'))
city = input('请输入您要查询的城市名称 / (按 Q 退出):').upper()
if city == 'Q':
print('您已退出天气查询系统!')
break
url = url_name(city)
# 调用函数构建向网站提请数据申请的链接字串
if url is None:
print('没有查询到对应的城市代码,请输入城市的中文名称,如厦门')
continue
response = requests.get(url)
# 向网站请求,返回网站回应的response对象
rs_dict = json.loads(response.text)
# 使用loads()将json字符串转换成字典类型
error_code = rs_dict['status']
# 根据网站的API接口说明,error为200表示数据正常,否则没有查询到天气信息
if error_code == 200:
# 对数据的处理完全由返回JSON的内部结构和键值决定
results = rs_dict.get('data')
city_name = rs_dict.get('city') # 城市
today = {
'date': rs_dict.get('date'), # 日期
'humidity': results.get('shidu'), # 湿度
'pm25': results.get('pm25'), # PM25
'pm10': results.get('pm10'), # PM10
'quality': results.get('quality'), # 空气质量
'comment': results.get('ganmao') # 健康提议
}
datestr = datetime.strptime(today['date'], '%Y%m%d').strftime('%Y-%m-%d')
# 网站回应的数据取出的today['date']是个字符串'20180725',引入datetime.strptime(today['date'], '%Y%m%d')
# 是为了把这个字符串变成日期对象,'%Y%m%d'是帮忙解释字符串:2018表示年;07月;25日
# 再通过日期对象的方法函数strftime()变成字符串,格式由参数'%Y-%m-%d'指定,即2018-07-25
print('当前城市>>> {} {}:'.format(city_name, datestr))
print('湿度:{humidity}; PM25:{pm25}; PM10:{pm10}; 空气质量:{quality}; 健康提议:{comment}'.format(**today))
# 字典变量按照占位符{}内的键值把值填进去
# 循环取出天气数据并输出
for weather_dict in results['forecast']:
# 取出日期、天气、风级、温度
date = weather_dict['date'] # 日期
weather = weather_dict['type'] # 天气
wind = weather_dict['fx'] + weather_dict['fl'] # 风向+风级
tempH = weather_dict['high'] # 温度
tempL = weather_dict['low'] # 温度
notice = weather_dict['notice'] # 注意事项
print('{} | {} | {} | {} | {} | {}'.format(date, weather, wind, tempH, tempL, notice))
else:
print('没有查询到 {} 的天气信息!'.format(city))