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

Nic*_*ber 5 python pyinstaller

我一直在尝试通过 pyinstaller 的文档来弄清楚如何做到这一点,但我没有任何运气。

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

python pyinstaller.py my_code.py
Run Code Online (Sandbox Code Playgroud)

它编译成一个 linux 可执行文件。

Mat*_*hew 5

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

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

    $ uname -op
    x86_64 GNU/Linux
    $ grep DISTRIB_DESCRIPTION /etc/lsb-release  
    DISTRIB_DESCRIPTION="Ubuntu 15.10"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 确保安装了 Python。

    $ apt-get install python2.7
    [installed OK]
    $ python --version
    Python 2.7.10
    
    Run Code Online (Sandbox Code Playgroud)
  3. (升级和)使用 Python 包管理器在 Linux 上安装并可能升级 Pyinstaller。在没有超级用户权限的情况下运行 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
    
    Run Code Online (Sandbox Code Playgroud)
  4. 您可以安装 Python/Pyinstaller、安装/配置 WINE 并以任何顺序编写 Python 代码(尽管运行代码需要安装 Python)。使用 Python 包管理器安装 Python 项目挂起的 Python 包。

    $ pip install package1 [package2, ...]
    [packages installed OK]
    
    Run Code Online (Sandbox Code Playgroud)
  5. 测试打包面向 Linux 的可执行文件。

    $ cd python-project
    $ pyinstaller --onefile python-project.py
    [built OK]
    $ dist/python-project
    [ran OK]
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    $ wine --version
    wine-1.7.50
    $ winecfg
    [GUI: Applications tab > Windows Version: Windows 7]
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)

    选择安装目录后,我遇到了 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
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  9. 使用 Windows pip 安装项目的挂起包

    $ wine C:/Python27/Scripts/pip.exe install xlwt
    [installed OK]
    
    Run Code Online (Sandbox Code Playgroud)
  10. 现在,您的 Windows (WINE) Python 环境已配置为与 Linux 本机环境等效。在 WINE 下运行 Windows Pyinstaller 会生成本机 Windows .exe 可执行文件。使用 Windows Python 脚本版本的 Windows Pyinstaller 来保持与经过测试的 OK Linux Pyinstaller 过程的对等性,与 Linux 文件系统中的 python 项目(不需要将其复制到 WINE Windows 文件系统)。将 Windows build 和 dist 目录与经过测试的 OK Linux 目录分开可以帮助调试打包过程。

     $ 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]
    
    Run Code Online (Sandbox Code Playgroud)


Mar*_*eth 2

来自pyinstaller 常见问题解答

\n\n
\n

我可以在 Linux 下运行时打包 Windows 二进制文件吗?

\n\n

不,不支持此操作。请\n 为此使用 \xe2\x80\x8bWine,PyInstaller 在 Wine 中运行良好。您可能还想看看邮件列表中的 \xe2\x80\x8b 这个线程。在 1.4 版本中,我们内置了对此的一些支持,但它只能工作一半。它需要另一个分区上的一些 Windows 系统,并且仅适用于纯 Python 程序。一旦您想要一个像样的 GUI\n(gtk、qt、wx),您就需要安装 Windows 库。因此,仅使用 Wine 就容易得多。

\n
\n\n

换句话说,您不能像您尝试那样简单地在 Linux 中运行命令来构建 Windows 可执行文件(或 Mac 可执行文件)。他们为 Windows(且仅适用于 Windows)提供的解决方法是安装Wine

\n\n

Wine是一个允许Windows程序在Linux上运行的程序。它创建一个复制 Windows 环境的环境。这个想法是,您可以将 Python(使用 Windows Python 安装程序)以及您需要的任何其他库(例如 pyinstaller)安装到此环境中。然后,仍然在该环境中运行 python pyinstaller。

\n\n

我还没有完成所有这些,但常见问题解答中提到的邮件列表线程将是一个好的开始。这是他们使用的一个示例:

\n\n
PYDIR="c:/Python27" \nPYTHON="wine $PYDIR/python.exe" \nWINPWD=$(winepath -w $(pwd))\n\ncd pyinstaller \n\n$PYTHON Configure.py \n$PYTHON Makespec.py -p $WINPWD $WINPWD/diceroller.py \n$PYTHON Build.py diceroller/diceroller.spec \n
Run Code Online (Sandbox Code Playgroud)\n\n

看起来这使用了旧的“Configure.py”、“Makespec.py”和“Build.py”,而现在“pyinstaller.py”脚本尝试为您完成所有这些操作。

\n