pyinstaller将.py文件转成可执行文件

查询预测国内各地天气和pm值里的程序为例,代码保存为weatherPM.py(附在帖子最后),有一个查询城市代码的支持文件city.json。用pyinstallerweatherPM.py打包成可执行文件夹。

  1. 先将命令/终端窗口调出来:Windows通过cmd调出的命令窗口;Mac用commoand + 空格调出搜索栏,搜索栏里输入terminal调出terminal窗口。 
  1. 在命令/终端窗口上输入pyinstaller时,可以明确指出py的路径。

               Mac: pyinstaller /users/PythonABC/Documents/python/weatherPM.py

               Windows:pyinstaller “C:\Documents and Settings\python\weatherPM.py”

  1. 也可以先进入py所在的文件夹再输入命令, 直接输入pyinstaller weatherPM.py或者pyinstaller -D weatherPM.py,见图:

pyinstaller打包会在weatherPM.py所在文件夹下生成一个weatherPM.spec文件。之前没有builddist这两个文件夹的就再建立两个文件夹builddist,已经有了这两个文件夹就使用已经建好的文件夹。

weatherPM.spec是打包的参数设定文件,必要时可以修改。build文件夹存放打包过程中产生的日志和一些工作文件。dist是英文distribute分发的前四个字母,意指里面的内容是可以分发给用户使用的。dist文件里面是打包好了可执行文件夹。

如果先后用pyinstallerweatherPM.pylocateIP.py进行打包,这dist文件夹里会有weatherPMlocateIP两个可执行文件夹。weatherPM可执行文件(Mac)或weatherPM.exeWindows)到dist下的weatherPM文件夹可以找得到,双击运行。发送给用户时要把整个weatherPM文件夹发给用户。升级代码时,如果引用的第三方模块和依托文件都不变,则只需把升级后的代码重新生成的可执行文件weatherPMMac)或weatherPM.exeWindows)发送给用户即可, 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))