Python x64和x86平台下pyinstaller打包过程

2023-11-04

使用目的

  有时因为工作需要或是客户的电脑环境不同等因素,比如客户的电脑是XP或Windows Vista较低版本的32位操作系统,只能运行32位的程序,这时自己的Python程序也必须支持向下兼容,就得做出2个版本的程序:32位和64位的。

  32位操作系统只能运行32位的程序,不能运行64位的程序。64位操作系统能运行32位和64位的程序。

另外,CPU支持64位,但电脑装了32位操作系统,也是不能运行64位的程序。详情

- 32位操作系统 64位操作系统
32位程序 支持 支持 (向下兼容)
64位程序 不支持 支持

使用环境

  操作系统: Windows 10 LTSC (2018版)

  Python版本:3.8.6   (Python3.5及以上版本均可,Python2未测试)

安装x64和x86的Python

 Python的版本可以在官网https://www.python.org下载安装。或者是找Python官网提供的FTP服务https://www.python.org/ftp/python/,自己找对应版本来下载。

官网下载:
python官网的download

FTP下载:
python的ftp

具体操作

 本文使用FTP的方式下载Python。
 下载python-3.8.6.exepython-3.8.6-amd64.exe没有指明amd64字样的默认是32位程序。
下载python

安装32位程序

步骤1
安装32位python步骤1

步骤2
安装32位python步骤2

步骤3
安装32位python步骤3
步骤4
安装32位python步骤4
安装64位程序

  步骤1、2、4和安装32位Python的步骤相同。
安装64位python步骤1



升级pip

安装完成后,打开32位Python目录:Python38-32\Scripts。用cmd进入Python38-32\Scripts到目录,执行如下命令。

where pip   # 显示程序所在目录

where pip

看到where pip命令显示有2个路径,需要手动把Python38-32\Scripts目录下的所有文件加个自定义的后缀名,辨别32位Python的pip。
修改32位pip

where pip再次查看,发现pip.exe只有64位Python目录的。之后调用32位pip.exe都用pip-32.exe即可。
where pip

pip部分命令参考:

pip list								# 查看pip安装的包
pip show [包名]							# 显示包的路径和具体信息
pip install --upgrade [包名]			# 更新包的版本
pip install --default-time=666 [包名]	# 安装包,设定超时时间为666秒 
pip install --upgrade --user [包名]		# 更新包的版本,安装在当前用户的家目录下

通过pip list可以看到64位Python下pip安装的包,初次安装pip会有WARNING的提示,提示pip版本低,需要升级pip。

WARNING: You are using pip version 20.2.1; however, version 20.3.3 is available.
You should consider upgrading via the 'f:\program files\python38\python.exe -m pip install --upgrade pip' command.

升级pip错误操作

 因为安装Python时勾选了Install for all users,所以升级pip时要加上--user的命令,否则报错:

F:\Program Files (x86)\Python38-32\Scripts>pip install --upgrade pip
Looking in indexes: https://pypi.mirrors.ustc.edu.cn/simple/
Collecting pip
  Using cached https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/54/eb/4a3642e971f404d69d4f6fa3885559d67562801b99d7592487f1ecc4e017/pip-20.3.3-py2.py3-none-any.whl (1.5 MB)
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 20.2.1
    Uninstalling pip-20.2.1:
ERROR: Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问。: 'f:\\program files\\python38\\scripts\\pip.exe'
Consider using the `--user` option or check the permissions.

注意这里有一句Attempting uninstall: pip是卸载pip的意思,因为pip更新包时必须先删除旧的包然后再下载新的包。
因为升级pip失败中途跳出,导致pip被卸载,这时cmd输入pip就会报错。提示No module named 'pip'

F:\Program Files (x86)\Python38-32\Scripts>pip
Traceback (most recent call last):
  File "f:\program files\python38\lib\runpy.py", line 194, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "f:\program files\python38\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "F:\Program Files\Python38\Scripts\pip.exe\__main__.py", line 4, in <module>
ModuleNotFoundError: No module named 'pip'

重新下载pip的方法一:参考https://www.cnblogs.com/igoodful/p/11479199.html   注意要加--user
重新下载pip的方法二:pip-32 install --upgrade --user pip  即用32位Python的pip去更新pip。


升级pip后,64位和32位的Python共用用户家目录下的pip。 (pip-32 show pip验证)
但下载的包具体是32位还是64位是看你用哪个pip去下载。
pip.exe下载的包在64位Python目录下,是64位的包。
pip-32.exe下载的包在32位Python目录下,是32位的包。

有些包是只有32位的,若在64位Python下载该包,会下载到32位的包。



升级pip报错后重新下载pip还会有部分残留需要手动清除:

F:\Program Files (x86)\Python38-32\Scripts>pip list
Package    Version
---------- -------
-ip        20.2.1    # 残留的包。在Lib\site-packages目录下手动清除
pip        20.3.3
setuptools 49.2.1



升级pip正确操作

pip install --upgrade --user pip

pip升级完成后用pip list验证当前包的版本。pip show pip查看pip的具体路径。



(可选操作):

cmd执行where python.exe会看到2个python:
F:\Program Files (x86)\Python38-32\Scripts>where python
F:\Program Files\Python38\python.exe
F:\Program Files (x86)\Python38-32\python.exe

但cmd执行where py.exe只会看到1个python:
F:\Program Files (x86)\Python38-32\Scripts>where py.exe
C:\Windows\py.exe

而且用py.exe打开的环境一直都是64位的Python,先装32位后装64位也不会影响这个py.exe

F:\Program Files (x86)\Python38-32\Scripts>py
Python 3.8.6 (tags/v3.8.6:db45529, Sep 23 2020, 15:52:53) [MSC v.1927 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

所以用py.exe去区分64位和32位的Python更方便。方法:
复制32位的Python.exe到C:\Windows目录,重命名:py32.exe
以后在cmd运行32位Python就用py32.exe, 运行64位Python就用py.exe

F:\Program Files (x86)\Python38-32\Scripts>py32
Python 3.8.6 (tags/v3.8.6:db45529, Sep 23 2020, 15:37:30) [MSC v.1927 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

最后:如果装完了32位和64位的Python,发现C:\Windows目录根本没有py.exe,不影响!
复制64位的Python.exe重命名py.exe,再复制32位的Python.exe重命名py32.exe到C:\Windows目录下,同样可以。






安装x64和x86的pyinstaller

x64的pyinstaller安装

pip install pyinstaller	# 安装pyinstaller包
pip show pyinstaller	# 查看pyinstaller包
F:\Program Files (x86)\Python38-32>pip show pyinstaller
Name: pyinstaller
Version: 4.2
Summary: PyInstaller bundles a Python application and all its dependencies into a single package.
Home-page: http://www.pyinstaller.org/
Author: Hartmut Goebel, Giovanni Bajo, David Vierra, David Cortesi, Martin Zibricky
Author-email: None
License: GPLv2-or-later with a special exception which allows to use PyInstaller to build and distribute non-free programs (including commercial ones)
Location: f:\program files\python38\lib\site-packages		# 装在64位Python目录
Requires: pywin32-ctypes, pefile, pyinstaller-hooks-contrib, setuptools, altgraph
Required-by:

x86的pyinstaller安装

pip-32 install pyinstaller	# 安装pyinstaller包
pip-32 show pyinstaller		# 查看pyinstaller包
F:\Program Files (x86)\Python38-32>pip-32 show pyinstaller
Name: pyinstaller
Version: 4.2
Summary: PyInstaller bundles a Python application and all its dependencies into a single package.
Home-page: http://www.pyinstaller.org/
Author: Hartmut Goebel, Giovanni Bajo, David Vierra, David Cortesi, Martin Zibricky
Author-email: None
License: GPLv2-or-later with a special exception which allows to use PyInstaller to build and distribute non-free programs (including commercial ones)
Location: f:\program files (x86)\python38-32\lib\site-packages		# 安装在32位Python目录
Requires: pefile, altgraph, pyinstaller-hooks-contrib, pywin32-ctypes, setuptools
Required-by:

安装完成后用where pyinstaller发现会有2个路径

F:\Program Files (x86)\Python38-32>where pyinstaller
F:\Program Files\Python38\Scripts\pyinstaller.exe
F:\Program Files (x86)\Python38-32\Scripts\pyinstaller.exe

进入32位Python目录:Python38-32\Scripts,重命名32位的pyinstaller.exepyinstaller32.exe。区分64位和32位的pyinstaller




分别打包x64和x86的程序

  在自己的工程目录下新建hello.py来测试打包x64和x86的程序。

hello.py:

# coding=utf-8
print('hello world')
input('按任意键退出')

打包64位程序

hello.py目录下用cmd执行

pyinstaller -F hello.py

执行完成后会在hello.py的目录生成dist目录,运行dist\hello.exe
打开任务管理器,在详细信息里查看 平台 的信息,显示为64位。
平台 的显示(win10):在列表头的地方 右键 -> 选择列,找到平台,勾选。
64位hello.exe

打包32位程序

hello.py目录下用cmd执行

pyinstaller32 -F hello.py

执行完成后会在hello.py的目录生成dist目录,运行dist\hello.exe
打开任务管理器,在详细信息里查看 平台 的信息,显示为32位。
平台 的显示(win10):在列表头的地方 右键 -> 选择列,找到平台,勾选。
32位hello.exe


附加:验证x64和x86的pyinstaller

  成功执行打包x64和x86的操作后,当前用户目录的\AppData\Roaming目录下会生成一个pyinstaller文件夹,打开后有2个文件夹:bincache00_py38_32bitbincache00_py38_64bit,表示在不同py版本、不同平台下的pyinstaller缓存文件。
验证pyinstaller

Python 修改 pip 源为国内源

Python 修改 pip 源为国内源

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python x64和x86平台下pyinstaller打包过程 的相关文章

  • 尽管极其懒惰,但如何在 Python 中模拟 IMAP 服务器?

    我很好奇是否有一种简单的方法来模拟 IMAP 服务器 例如imaplib模块 在Python中 without做很多工作 是否有预先存在的解决方案 理想情况下 我可以连接到现有的 IMAP 服务器 进行转储 并让模拟服务器在真实的邮箱 电子
  • Python BigQuery 存储。并行读取多个流

    我有以下玩具代码 import pandas as pd from google cloud import bigquery storage v1beta1 import os import google auth os environ G
  • Python、Tkinter、更改标签颜色

    有没有一种简单的方法来更改按钮中文本的颜色 I use button text input text here 更改按下后按钮文本的内容 是否存在类似的颜色变化 button color red Use the foreground设置按钮
  • 如何使用包含代码的“asyncio.sleep()”进行单元测试?

    我在编写 asyncio sleep 包含的单元测试时遇到问题 我要等待实际的睡眠时间吗 I used freezegun到嘲笑时间 当我尝试使用普通可调用对象运行测试时 这个库非常有用 但我找不到运行包含 asyncio sleep 的测
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • 在循环中每次迭代开始时将变量重新分配给原始值(在循环之前定义)

    在Python中 你使用 在每次迭代开始时将变量重新分配给原始值 在循环之前定义 时 也就是说 original 1D o o o for i in range 0 3 new original 1D revert back to orig
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • Abaqus 将曲面转化为集合

    我一直试图在模型中找到两个表面的中心 参见照片 但未能成功 它们是元素表面 面 查询中没有选项可以查找元素表面的中心 只能查找元素集的中心 找到节点集的中心也很好 但是我的节点集没有出现在工具 gt 查询 gt 质量属性选项中 而且我找不到
  • Python:字符串不会转换为浮点数[重复]

    这个问题在这里已经有答案了 我几个小时前写了这个程序 while True print What would you like me to double line raw input gt if line done break else f
  • Numpy 优化

    我有一个根据条件分配值的函数 我的数据集大小通常在 30 50k 范围内 我不确定这是否是使用 numpy 的正确方法 但是当数字超过 5k 时 它会变得非常慢 有没有更好的方法让它更快 import numpy as np N 5000
  • 如何改变Python中特定打印字母的颜色?

    我正在尝试做一个简短的测验 并且想将错误答案显示为红色 欢迎来到我的测验 您想开始吗 是的 祝你好运 法国的首都是哪里 法国 随机答案不正确的答案 我正在尝试将其显示为红色 我的代码是 print Welcome to my Quiz be
  • 通过数据框与函数进行交互

    如果我有这样的日期框架 氮 EG 00 04 NEG 04 08 NEG 08 12 NEG 12 16 NEG 16 20 NEG 20 24 datum von 2017 10 12 21 69 15 36 0 87 1 42 0 76
  • Python:计算字典的重复值

    我有一本字典如下 dictA unit1 test1 alpha unit1 test2 beta unit2 test1 alpha unit2 test2 gamma unit3 test1 delta unit3 test2 gamm
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • 在 Python 类中动态定义实例字段

    我是 Python 新手 主要从事 Java 编程 我目前正在思考Python中的类是如何实例化的 我明白那个 init 就像Java中的构造函数 然而 有时 python 类没有 init 方法 在这种情况下我假设有一个默认构造函数 就像
  • 您可以在 Python 类型注释中指定方差吗?

    你能发现下面代码中的错误吗 米皮不能 from typing import Dict Any def add items d Dict str Any gt None d foo 5 d Dict str str add items d f
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数
  • Python 分析:“‘select.poll’对象的‘poll’方法”是什么?

    我已经使用 python 分析了我的 python 代码cProfile模块并得到以下结果 ncalls tottime percall cumtime percall filename lineno function 13937860 9

随机推荐

  • 四合天地软件测试系统,GZ-2017025软件测试赛题.-全国职业院校技能大赛.doc

    GZ 2017025软件测试赛题 全国职业院校技能大赛 doc 2017年全国职业院校技能大赛高职组 软件测试 项目竞赛任务书 2017年全国职业院校技能大赛 高职组 软件测试 赛项执委会制 2017年5月 目录 一 赛程说明3 二 竞赛技
  • ElasticSearch启动流程指令及注意事项

    elasticsearch es的集群部署 第一步 创建普通用户 注意 ES不能使用root用户来启动 必须使用普通用户来安装启动 这里我们创建一个普通用户以及定义一些常规目录用于存放我们的数据文件以及安装包等 创建一个es专门的用户 必须
  • 第一个python代码,第一个错误。python是对缩进严格要求的代码。

    在编写第一个条件判断语句的代码中 就遇到了第一个错误 运行py时提示 仔细对照了一下代码 发现原来时缩进格式错误 并很不明显 条件语句的if换行一般是缩进四个空格 但个人觉得以其按四个空格 不如直接按一下tab键来得简洁明了 我两种方法都试
  • SpringCloud 商城系统搭建之Ribbon (基于Ribbon + RestTemplate)

    Spring Cloud 服务调用方式 Spring Cloud有两种服务调用方式 一种是Ribbon RestTemplate 另一种是feign 在这一篇文章首先讲解下基于Ribbon RestTemplate Ribbon简介 Rib
  • 自定义实现nn.CrossEntropyLoss损失函数

    nn CrossEntropyLoss是在PyTorch中常用的交叉熵损失函数 它主要用于解决多分类问题 但也可以用于解决二分类问题 该函数有两个输入参数 第一个参数是网络的最后一层的输出 是一个二维数组 其中每个向量包含不同类别的概率值
  • 蓝桥杯省赛C++A组B组题解整理(第十、九、八、七、六、五、四、三届)

    写在前面的话19 03 24 从第八届蓝桥杯到第十届蓝桥杯 我也是参加了三届蓝桥杯的老学姐啦 更不更新第十届的题解取决于网上有没有流出题目 但是第十届之后的题解将不会再更新了 下面的这些真题大多是我在大一的时候刷的 在大二的时候整理的 在大
  • FM模型

    FM模型 一 FM模型的意义 1 传统模型的缺点 忽略了特征之间的联系 特征高维 稀疏 容易爆炸 2 什么是FM模型 FM就是Factor Machine 因子分解机 FM通过对两两特征组合 引入交叉项特征 提高模型得分 其次是高维灾难 通
  • 5种免费企业邮箱

    现在 企业邮箱的使用越来越普遍 而企业一方面想用 而且又不花钱 这就要求我们这些网管人员好好找一下了 而哪些是免费的而且又好用的呢 以下是公司使用的 网易免费企业邮 贴出来和大家分享 首页 申请成功的企业邮 基本设置 用户数200 最大容量
  • 字节青训营第四课之高性能Go语言发行版优化与落地实践的笔记和总结

    这是字节青训营的第四课 高性能Go语言发行版优化与落地实践的笔记和总结 概览 本节课主要介绍性能优化和实践 性能优化包括自动内存管理 Go内存管理及优化 编译器与静态分析 编译器优化 实践包括字节内部的Balanced GC优化对象分配以及
  • java与以太坊之web3j

    web3j https docs web3j io index html 如何使用Web3j生成私钥和地址 而不只是创建密钥存储JSON文件 https blog csdn net mongo node article details 81
  • 写作——如何制作参考文献

    进入点ScienceDirect WOS Springer输入相关词找到文献后点 cite 选择bibtex就有bib文件内需要的信息 自己加以修改 无论什么网站搜索的信息 都必须经过自己加工整理 bib文件里格式必须保持一致 1 Late
  • 领域驱动设计-贫血模型VS充血模型

    项目实现方式 事务脚本 事务脚本的核心是过程 通过过程的调用来组织业务逻辑 每个过程处理来自表现层的单个请求 大部分业务应用都可以被看成一系列事务 从某种程度上来说 通过事务脚本处理业务 就像执行一条条Sql语句来实现数据库信息的处理 事务
  • SpringCloud微服务项目快速搭建(一)(SpringCloud Netflix,H版-SR3)

    一 前言 Spring Cloud Netflix是Spring Cloud生态系统中的重要组成部分 也是使用Spring Cloud进行微服务架构开发的主要方向之一 Spring Cloud Netflix主要目标是为开发者提供构建分布式
  • Tomcat WebappClassLoader 类加载机制源码分析

    tomcat中的ClassLoader 启动类加载器 BootStrap ClassLoader 引导类装入器是用本地代码实现的类装入器 它负责将 jdk中jre lib下面的核心类库或 Xbootclasspath选项指定的jar包加载到
  • webm格式怎么转换成mp4?四招快速转换!

    众所周知 视频是我们生活工作中的重要内容 也是传播信息 促进交流的关键工具 随着各类短视频平台的兴起和发展 视频技术也在不断创新 目前 视频格式相对较多 而一些社交网站 短视频软件对视频格式有一定的限制 并不是所有的视频格式都能够被支持的
  • Python 流体动力学层流建模

    使用单相层流的有限差分法求解二维 Navier Stokes 方程 纳维 斯托克斯方程 并使用基准盖腔测试验证结果 介绍 在许多自然现象中都可以观察到流体流动 从舒缓的瀑布到计算机键盘上令人恼火的咖啡飞溅 看到损坏的键盘上的咖啡后 您的第一
  • Unity打开出现两个空白错误的解决方法

    直接上结论 将unity和hub全部重装 问题描述 unity上周还用的好好的 这周打开突然console出现了两个空白错误导致无法运行 版本 2019 4 21 网上的方法 重装unity 改中文路径 改C 改Net 改这改哪的 要么看不
  • CVTE校招笔试

    CVTE校招挺注重基础 并且很多ES6语法 1 变量提升 2 考察call apply bind 和ES6双冒号绑定符 fun bun 相当于 bun bind fun fun bun 相当于 bun apply fun 3树结构 4栈结构
  • 《SystemVerilog验证测试平台编写指南》学习笔记——线程以及线程间的通信(三)

    一 旗语 1 旗语的操作 2 带多个钥匙的旗语 二 信箱 1 测试平台里的信箱 2 定容信箱 3 在异步线程间使用信箱通信 4 使用定容信箱和探视 peek 来实现线程的同步 5 使用信箱和事件来实现线程的同步 6 使用两个信箱来实现线程的
  • Python x64和x86平台下pyinstaller打包过程

    文章目录 使用目的 使用环境 安装x64和x86的Python 具体操作 升级pip 升级pip错误操作 升级pip正确操作 安装x64和x86的pyinstaller 分别打包x64和x86的程序 打包64位程序 打包32位程序 Pyth