在Linux上将Python脚本打包成Windows可执行文件

68
我有一个Python脚本,想将其编译为Windows可执行文件。现在,py2exe从Windows工作正常,但我想能够从Linux运行它。虽然我的开发机上有Windows,但Linux是我的主要开发平台,我已经厌倦了不得不重启到Windows才能创建.exe的情况。也不想购买第二个Windows许可证来运行VirtualBox等虚拟机。有什么办法吗?
PS:我知道py2exe并没有像编译Python文件那样编译Python文件,而是将您的脚本与Python解释器打包在一起。但无论哪种方式,结果都是您无需安装Python即可运行脚本。

当我需要使用一些仅限于Windows的内容(例如IE或测试NSIS安装包)时,我会使用带有Windows的虚拟机;Virtualbox非常好用,无需重新启动。当然,这只是规避问题的方法。 - Piskvor left the building
2
啊,但是从技术上讲,你需要两个Windows许可证来完成这项任务... - Chinmay Kanchi
3
我吗?怎么了?在我的情况下,主机操作系统不是Windows,只有客户操作系统是。 - Piskvor left the building
为了不需要两个许可证,一个用于裸机,一个用于VirtualBox,提问者必须先从裸机卸载Windows并在VirtualBox中安装它。我不确定OEM许可证是否允许这样做。 - Damian Yerrick
1
OEM许可证要求从何而来?我在问题中没有看到任何提及;不要做过多的假设。 - Piskvor left the building
6个回答

44

正如其他回答者所提到的,自从1.5版本以来,PyInstaller已经移除了交叉编译功能。这里将展示如何使用PyInstallerWine下打包Python脚本为Windows可执行文件。

步骤1:安装Wine和Python

sudo apt-get install wine
wine msiexec /i python-2.7.10.msi /L*v log.txt

附注:

  • 新版本的Python已经包含了pip(用于安装 pyinstaller),从这里下载Python安装包(例如,python-2.7.10.msi)。

  • 对于macOS用户,请使用brew cask install xquartz wine-stable

步骤2:在 Wine 上安装 PyInstaller

$ cd ~/.wine/drive_c/Python27
$ wine python.exe Scripts/pip.exe install pyinstaller

Successfully installed pyinstaller-3.1.1 pypiwin32-219

第三步:打包Python脚本

使用pyinstaller将Python脚本(例如HelloWorld.py)打包。

$ wine ~/.wine/drive_c/Python27/Scripts/pyinstaller.exe --onefile HelloWorld.py

# filename: HelloWorld.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

print('Hello World!')

Windows可执行文件位于dist/目录下。

$ wine dist/HelloWorld.exe 
Hello World!
fixme:msvcrt:__clean_type_info_names_internal (0x1e24e5b8) stub

详细说明请参考这里


2
你需要在Wine中安装所有的依赖项(尽管你可能已经在Ubuntu中安装了它们)。确保你的应用程序可以使用命令wine python appli.py运行。 - Jithin Pavithran
现在已经没有办法在Wine上安装Python 3,所以这个变得毫无用处。 - Jacob Sánchez
如果您没有.msi文件,也可以通过wine安装Python。请参考https://askubuntu.com/questions/678277/how-to-install-python3-in-wine。 - Eugene

21

你看过了PyInstaller吗?

它似乎通过版本1.4支持跨平台编译(在1.5+版本中删除了此功能)。参见此答案以了解如何使用Wine在PyInstaller 1.5+下进行跨平台编译。

文档说:

 

添加对跨平台编译的支持:现在,当在Linux下运行时,PyInstaller能够构建Windows可执行文件。有关详细信息,请参阅文档。

我自己没有尝试过。

希望这会有所帮助。


1
我会尝试一下。立即的问题已经通过重新启动进入Windows解决了,但是现在我已经几乎完全转到Linux上,这很可能会经常出现。感谢你的提醒! - Chinmay Kanchi
6
此功能将被移除:https://groups.google.com/forum/?fromgroups#!searchin/PyInstaller/linux$20windows/pyinstaller/veq3BlA_Bns - hoju
12
未来的访客,请注意以下有效链接:https://groups.google.com/forum/?fromgroups#!topic/pyinstaller/veq3BlA_Bns - TheLQ
1
似乎有些用户可以在Linux上使用Wine下的pyInstaller成功编译Windows exe。你可以试一试。 - gaborous
4
正如 @hoju 提到的那样,自从1.5版本以后,PyInstaller已经删除了这个功能。请参考http://www.pyinstaller.org/wiki/FAQ#Features: “在版本1.4中,我们内置了一些对此的支持,但它只能半工半糊地工作。 它需要另一个分区上的Windows系统,并且仅适用于纯Python程序。 一旦您想要一个像gtk、qt或wx这样的良好GUI界面,您将需要安装Windows库。 因此,使用Wine会更容易。” - azalea
显示剩余8条评论

3
你可以在VirtualBox中运行Windows以运行py2exe。 VBox提供了一个强大的命令行客户端来自动化任务,因此您可以很容易地将其集成到开发过程中。

5
从技术上讲,这需要我拥有另一个Windows许可证,但我宁愿不涉及其中。但还是点赞(+1)。 - Chinmay Kanchi
或者你可以使用Windows的破解版,如果你想的话,只是为了测试目的。 - Murilo Melo
1
你也可以购买一台全新的带有Windows系统的电脑。 - Jacob Sánchez

3
我写了一篇关于如何使用PyInstaller和WINE在Linux上创建Python可执行文件的博客文章。以下是摘要:
  • 如何使用PyInstaller和WINE在Linux上创建Python可执行文件
    • 下载Python 3.8 Windows安装程序
    • wine python-3.8.9.exe,然后按照下面的说明进行操作
    • wine C:/Python38/python.exe -m pip install --upgrade pip
    • wine C:/Python38/python.exe -m pip install -r requirements.txt,其中requirements.txt应包含PyInstaller本身
    • wine C:/Python38/Scripts/pyinstaller.exe ...
    • 全部完成!

在WINE中安装Python 3.8:

  1. 勾选“Add Python 3.8 to PATH”
  2. 点击“Customize installation”
  3. 点击“下一步”
  4. 点击“Install for all users”
  5. 将安装位置设置为C:\\Python38
  6. 点击“Install”
  7. 关闭窗口。

欢迎阅读文章以获取更多详细信息。


3

测试平台: Kubuntu 20.04、wine 6.0、python38

下载 wine 和 python

  1. https://www.python.org/downloads/release/python-3810/下载 Windows 版本的 Python。

  2. 安装 Wine sudo apt install wine

  3. 打开终端并运行 wine 你下载的 Python exe 文件

  4. 运行 find ~/.wine -name pip.exe 这将给出 pip 的路径:

/home/你的用户名/.wine/drive_c/users/你的用户名/Local Settings/Application Data/Programs/Python/Python38/Scripts/pip.exe

安装 pyinstaller

运行 wine /home/你的用户名/.wine/drive_c/users/你的用户名/Local\ Settings/Application\ Data/Programs/Python/Python38/Scripts/pip.exe install pyinstaller

打包文件

查找安装路径

find ~/.wine -name pyinstaller.exe

wine /home/你的用户名/.wine/drive_c/users/你的用户名/Local\ Settings/Application\ Data/Programs/Python/Python38/Scripts/pyinstaller.exe --onefile 你的 Python 文件名


这对我来说非常有帮助,因为您向我展示了如何找到wines pyinstaller.exe位置。 如果任何人在使用此输出位置时仍然遇到任何问题,请检查是否存在包含空格的文件。只需将它们用引号括起来,它就会正常工作。 - Shahriar Rahman Zahin

2
我已经在Wine中测试过py2exe,它可以正常运行。您需要在Wine中安装Python才能使其正常工作,或者如果您只使用标准库,则可以从Windows机器上捆绑py2exe并将其用于Wine。请记住,您需要在Wine中安装与编译Python时使用的ms visual C库版本相同的版本,否则事情就无法正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接