Packaging a Python script on Linux into a Windows executable
I have a Python script that I'd like to compile into a Windows executable. Now, py2exe
works fine from Windows, but I'd like to be able to run this from Linux. I do have Windows on my development machine, but Linux is my primary dev platform and I'm getting kind of sick of rebooting into Windows just to create the .exe
. Nor do I want to have to buy a second Windows license to run in a virtual machine such as VirtualBox. Any ideas?
PS: I am aware that py2exe
doesn't exactly compile the python file as much as package your script with the Python interpreter. But either way, the result is that you don't need Python installed to run 开发者_Go百科the script.
As mentioned by other answerers, the cross-compilation feature is removed from PyInstaller since 1.5
. Here, show how to package a Windows executable from Python scripts using PyInstaller under wine.
Step 1: Install wine and Python
sudo apt-get install wine
wine msiexec /i python-2.7.10.msi /L*v log.txt
PS:
Newer Python versions already include
pip
(is used to installpyinstaller
). Download Python installation package from here (e.g.,python-2.7.10.msi
)For macos users, use
brew cask install xquartz wine-stable
.
Step 2: Install PyInstaller on wine
$ cd ~/.wine/drive_c/Python27
$ wine python.exe Scripts/pip.exe install pyinstaller
Successfully installed pyinstaller-3.1.1 pypiwin32-219
Step 3: Package Python scripts
Package Python scripts (e.g., HelloWorld.py
) with pyinstaller
.
$ wine ~/.wine/drive_c/Python27/Scripts/pyinstaller.exe --onefile HelloWorld.py
# filename: HelloWorld.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
print('Hello World!')
The Windows executable file is located in dist/
.
$ wine dist/HelloWorld.exe
Hello World!
fixme:msvcrt:__clean_type_info_names_internal (0x1e24e5b8) stub
Refer to here for the detailed description.
Did you look at PyInstaller?
It seems that versions through 1.4 support cross-compilation (support was removed in 1.5+). See this answer for how to do it with PyInstaller 1.5+ under Wine.
Documentation says:
Add support for cross-compilation: PyInstaller is now able to build Windows executables when running under Linux. See documentation for more details.
I didn't try it myself.
I hope it helps
You could run Windows in VirtualBox in order to run py2exe. VBox offers a powerful command-line client for automating tasks, so it something that you could likely integrate into your development process with ease.
Tested on Platform: Kubuntu 20.04, wine 6.0, python38
Download wine and python
Download windows version of python from https://www.python.org/downloads/release/python-3810/
Install wine
sudo apt install wine
Open your terminal and run
wine the-python-exe-you-downloaded
Run
find ~/.wine -name pip.exe
this will give you the pip path:
/home/yourusername/.wine/drive_c/users/yourusername/Local Settings/Application Data/Programs/Python/Python38/Scripts/pip.exe
Install pyinstaller
Run wine /home/yourusername/.wine/drive_c/users/yourusername/Local\ Settings/Application\ Data/Programs/Python/Python38/Scripts/pip.exe install pyinstaller
Package your file
Find installation path
find ~/.wine -name pyinstaller.exe
wine /home/yourusernmae/.wine/drive_c/users/yourusername/Local\ Settings/Application\ Data/Programs/Python/Python38/Scripts/pyinstaller.exe --onefile yourpythonfile
I wrote a blog post on how to do this with PyInstaller. Here's the summary:
- How to create EXEs for Python on Linux, using PyInstaller and WINE
- Download Python 3.8 Windows installer
wine python-3.8.9.exe
, then see instructions belowwine C:/Python38/python.exe -m pip install --upgrade pip
wine C:/Python38/python.exe -m pip install -r requirements.txt
, andrequirements.txt
should include PyInstaller itselfwine C:/Python38/Scripts/pyinstaller.exe ...
- All done!
Installing Python 3.8 in Wine:
- Check "Add Python 3.8 to PATH"
- Click "Customize installation
- Click "Next"
- Click "Install for all users"
- Set the install location as
C:\\Python38
- Click "Install"
- Close the window.
Feel free to read the post to get more details.
I have tested py2exe inside of wine, and it does function. You'll need to install python in wine for it to work, or if you only use the standard libarary, you can bundle py2exe with py2exe from the windows machine and then use it in wine. Just keep in mind you need the same version of the ms visual C libraries in wine as were used to compile python or things won't work properly.
精彩评论