【问题标题】:How to compile python script to binary executable如何将python脚本编译为二进制可执行文件
【发布时间】:2012-09-02 14:38:50
【问题描述】:

我需要将 Python 脚本转换为 Windows 可执行文件。

我已将 Python 2.6 安装到 python26

我创建了一个脚本并将其保存在C:\pythonscript。这个文件夹里面有两个文件

Setup.pyoldlogs.py(此文件需要覆盖)

setup.py 代码是

from distutils.core import setup
import py2exe

setup(console=['oldlogs.py'])

如何将 oldlogs.py 转换为 exe 文件?

【问题讨论】:

标签: python compilation executable


【解决方案1】:

或使用PyInstaller 替代py2exe。这是一个很好的starting point。 PyInstaller 还允许您为 linux 和 mac 创建可执行文件...

以下是使用 PyInstaller 解决手头问题的方法:

pyinstaller oldlogs.py

来自工具的文档:

PyInstaller 分析 myscript.py 并:

  • 将 myscript.spec 写入与脚本相同的文件夹中。
  • 如果脚本不存在,则在与脚本相同的文件夹中创建一个构建文件夹。
  • 在构建文件夹中写入一些日志文件和工作文件。
  • 如果 dist 文件夹不存在,则在与脚本相同的文件夹中创建文件夹。
  • 将 myscript 可执行文件夹写入 dist 文件夹。

在 dist 文件夹中,您可以找到分发给用户的捆绑应用程序。

【讨论】:

  • cx_Freeze 更好,它甚至支持python 3.3。
  • 嘿,这甚至适用于wine,至少支持Windows XP的python 3.4版本。非常好!我在我的 Fedora Linux 机器上使用 winepython 3.4pip-Win 创建了一个 windows 可执行文件(只需按照 pyinstaller 网站上的安装说明) .
  • @AshwiniChaudhary,两者似乎都是跨平台的。但是,如果我必须根据GitHub 星数快速判断使用哪一个,PyInstaller 有 ~4000 星,cx_Freeze有200颗星。所以PyInstaller 似乎更受欢迎,并且可能涵盖了更多的边缘情况。 为什么你认为cx_FreezePyInstaller 好?
  • 请注意,与 PyInstaller 相比,“cx_Freeze 不支持构建单个文件 exe,您的应用程序的所有库都嵌入在一个可执行文件中。” cx-freeze.readthedocs.io/en/latest/…
【解决方案2】:

我推荐PyInstaller,一个简单的python脚本可以通过以下命令转换为exe:

utils/Makespec.py [--onefile] oldlogs.py

这会创建一个 yourprogram.spec 文件,该文件是用于构建最终 exe 的配置。下一条命令从配置文件构建 exe:

utils/Build.py oldlogs.spec

更多内容请关注here

【讨论】:

    【解决方案3】:

    由于其他 SO 答案链接到此问题,因此值得注意的是,PyOxidizer 中现在还有另一个选项。

    它是一个 rust 实用程序,在某些方面与 pyinstaller 工作方式相同,但有一些附加功能详述here,总结了关键功能:

    • 默认情况下所有软件包的单个二进制文件能够将模块零拷贝加载到内存中,而 pyinstaller 在使用 onefile 模式时会将它们提取到临时目录
    • 能够生成静态链接二进制文件

    pyoxidizer 的另一个优点是,如果您在 glibc 版本比目标更新的系统上创建二进制文件,它似乎不会受到 pyinstaller 可能出现的GLIBC_X.XX not found 问题的影响系统)。

    总体而言,pyinstaller 比 PyOxidizer 使用起来简单得多,后者通常需要在配置文件中添加一些复杂性,而且它的 Pythony 较少,因为它是用 Rust 编写的,并且使用 Python 世界中不太熟悉的配置文件格式,但 PyOxidizer 做了一些更高级的东西,特别是如果您希望生成单个二进制文件(这不是 pyinstaller 的默认设置)。

    【讨论】:

    【解决方案4】:
    # -*- mode: python -*-
    
    block_cipher = None
    
    a = Analysis(['SCRIPT.py'],
                 pathex=[
                     'folder path',
                     'C:\\Windows\\WinSxS\\x86_microsoft-windows-m..namespace-downlevel_31bf3856ad364e35_10.0.17134.1_none_50c6cb8431e7428f',
                     'C:\\Windows\\WinSxS\\x86_microsoft-windows-m..namespace-downlevel_31bf3856ad364e35_10.0.17134.1_none_c4f50889467f081d'
                 ],
                 binaries=[(''C:\\Users\\chromedriver.exe'')],
                 datas=[],
                 hiddenimports=[],
                 hookspath=[],
                 runtime_hooks=[],
                 excludes=[],
                 win_no_prefer_redirects=False,
                 win_private_assemblies=False,
                 cipher=block_cipher)
    pyz = PYZ(a.pure, a.zipped_data,
                 cipher=block_cipher)
    exe = EXE(pyz,
              a.scripts,
              a.binaries,
              a.zipfiles,
              a.datas,
              name='NAME OF YOUR EXE',
              debug=False,
              strip=False,
              upx=True,
              runtime_tmpdir=None,
              console=True )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      相关资源
      最近更新 更多