python - 在 Ubuntu 上将 .py 编译成 windows 和 mac 可执行文件

标签 python pyinstaller

我已经尝试了几个小时,想通过 pyinstaller 的文档弄清楚如何做到这一点,但我没有任何运气。

我有一个 .py 文件,我需要将其制作成一个在 Windows 7 中可执行的 .exe 文件,以及一个在 OS X Lion 中可执行的 .app(或任何可用的)可执行文件。问题是每当我使用

python pyinstaller.py my_code.py

它编译成 linux 可执行文件。

最佳答案

Pyinstaller 不会为跨平台目标构建可执行文件,仅针对“本地”运行 Pyinstaller 的平台。但是,WINE 允许在 Linux 下运行 native Windows Pyinstaller,因此它可以用于将在 Linux 上开发的 Python 脚本构建为 native Windows .exe 可执行文件,仅使用单个 Linux 主机 - 无需单独的 Windows 主机。这些说明不针对 Mac。

  1. 我在 64 位奔腾机型上使用 Ubuntu 15.10。

    $ uname -op
    x86_64 GNU/Linux
    $ grep DISTRIB_DESCRIPTION /etc/lsb-release  
    DISTRIB_DESCRIPTION="Ubuntu 15.10"
    
  2. 确保安装了 Python。

    $ apt-get install python2.7
    [installed OK]
    $ python --version
    Python 2.7.10
    
  3. (升级和)使用 Python 包管理器安装和 可能在 Linux 上升级 Pyinstaller。在没有 super 用户的情况下运行 pip 权限可能会失败。

    $ sudo -H pip install --upgrade pip
    [upgraded OK]
    $ sudo -H pip install PyInstaller
    [installed OK]
    $ sudo -H pip install --upgrade pyinstaller
    [installed OK]
    $ pyinstaller --version
    3.0
    
  4. 您可以安装 Python/Pyinstaller,安装/配置 WINE 并编写 任何顺序的 Python 代码(尽管运行代码需要 Python 是 安装)。使用 Python 包管理器安装 Python 依赖于您的 Python 项目的包。

    $ pip install package1 [package2, ...]
    [packages installed OK]
    
  5. 测试打包面向 Linux 的可执行文件。

    $ cd python-project
    $ pyinstaller --onefile python-project.py
    [built OK]
    $ dist/python-project
    [ran OK]
    

    如果它没有正常构建或运行,请尝试将其构建为 --onedir , Pyinstaller 默认,它不包括挂起的文件 单个可执行文件。那不应该构建/运行与 onefile 版本,但调试 onedir 会更容易 然后也应该将 OK 构建为一个文件。

  6. 确保安装了 WINE 并将其配置为使用您选择的 目标 Windows 版本(例如 Windows 7):

    $ wine --version
    wine-1.7.50
    $ winecfg
    [GUI: Applications tab > Windows Version: Windows 7]
    
  7. 使用 WINE 安装 Windows Python, pywin32 (Windows GUI 扩展);匹配他们的版本。你可能应该去每个 安装程序的正确版本和镜像的下载页面 比这些当前的直接下载链接。注意运行 WINE 将大量 WINE 错误通知转储到控制台;这些都是 在此过程中几乎可以忽略不计。

    $ mkdir -p /opt/windows $ pushd /opt/windows
    $ wget https://www.python.org/ftp/python/2.7.10/python-2.7.10.amd64.msi
    $ wget http://iweb.dl.sourceforge.net/project/pywin32/pywin32/Build%20219/pywin32-219.win-amd64-py2.7.exe
    $ wine msiexec -i python-2.7.10.amd64.msi $ wine msiexec -i pywin32-219.win-amd64-py2.7.exe
    $ popd
    

    我遇到了 Python 2.7.10 MSI 向导无法“下一步”的问题 选择安装目录后,我在那里取消了它,然后 再次运行它,添加抑制 GUI 的 -qn 选项。它 提示了一点,但它完成了安装。如果你需要 在你的 Linux 文件系统中找到 Windows Python 默认情况下 安装在您的 Linux 用户的默认 WINE“C:”目录中 主目录,即。 ~/.wine/drive_c/Python27 .

    $ wine C:/Python27/python --version Python 2.7.10
    $ find ~/.wine/drive_c -name python.exe ~/.wine/drive_c/Python27/python.exe
    
  8. 升级 Windows pip 并使用 WINE Python/pip 安装 Pyinstaller。

    $ wine C:/Python27/Scripts/pip.exe install --upgrade pip
    [upgraded OK]
    $ wine C:/Python27/Scripts/pip.exe --version
    pip 7.1.2 from C:\Python27\lib\site-packages (python 2.7)
    $ wine C:/Python27/Scripts/pip.exe install pyinstaller
    [installed OK]
    $ wine c:/Python27/python.exe C:/Python27/Scripts/pyinstaller-script.py --version
    3.0
    
  9. 使用 Windows pip 安装项目的挂起包

    $ wine C:/Python27/Scripts/pip.exe install xlwt
    [installed OK]
    
  10. 现在您的 Windows (WINE) Python 环境已配置完毕 等同于您的 Linux native 环境。运行窗口 WINE 下的 Pyinstaller 生成原生 Windows .exe 可执行文件。 使用 Windows Pyinstaller 的 Windows Python 脚本版本来 与你测试过的 OK Linux Pyinstaller 程序保持一致, 针对你的 Linux 文件系统中的 python 项目(它不 需要复制到 WINE Windows 文件系统)。保持 Windows build和dist目录分开测试OK Linux one可以帮助调试打包程序。

     $ wine c:/Python27/python.exe C:/Python27/Scripts/pyinstaller-script.py --onefile --workpath=./win-wrk --distpath=/opt/windows python-project.py
     [packaged OK]
     $ ls -F /opt/windows/python-project.exe
     python-project.exe*
     $ wine /opt/windows/python-project.exe
     [Windows app runs OK]
    

关于python - 在 Ubuntu 上将 .py 编译成 windows 和 mac 可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17709813/

相关文章:

python - Matplotlib:获取子图以填充图形

python - 为什么map_block函数运行两次?

python - 生成的 Windows exe (pyinstaller) 无法加载 _cffi_backend

python - Pyinstaller --windowed 或 --noconsole .exe 不允许 chromedriver 打开

python - 获取python项目使用的所有模块/包

python - Django - 如何更改 forms.ModelChoiceField 的值

python - Django 模型中的复杂过滤器

python - 棘手的 Python 3.5 CSV 难题 - 从 CSV 文件高效创建 100 个列表,无需每次都引用条件

python - 具有重要目录结构的 pyinstaller

python - Pyinstaller 在创建 exe 文件时无法导入 pylsd