使用 cx_Freeze 执行的 Python 脚本,exe 啥也不做

Posted

技术标签:

【中文标题】使用 cx_Freeze 执行的 Python 脚本,exe 啥也不做【英文标题】:Python script to executable with cx_Freeze, exe does nothing使用 cx_Freeze 执行的 Python 脚本,exe 什么也不做 【发布时间】:2018-10-17 18:23:35 【问题描述】:

出于练习目的,我决定编写一个密码生成器并使其成为可执行文件。 我的脚本正在按预期运行,并且编译也可以,但是当我运行 exe 文件时,什么也没有发生。 我运行 Windows 10 系统并使用 Python 3.6.x,我不是 Python 本身的初学者。

我在互联网上查找了各种页面,但没有发现任何对我有帮助的问题,我的第一个问题是编译不起作用,但我已经找到了解决方案。

编辑:我尝试使用 cmd 运行 exe,但没有输出,而是换行。

这是设置代码:

import sys
from cx_Freeze import setup, Executable

build_exe_options = "excludes": ["tkinter"]
base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(name="Password",
      version="1.0",
      description="Generates a password made of 20 characters",
      options="build_exe": build_exe_options,
      executables=[Executable("pass.py", base=base)])

这是我的程序:

import random
import string

for i in range(20):
   k = random.choice(string.ascii_letters)
   j = random.randint(0, 9)
   z = random.randint(1, 2)
   if z == 1:
      x = k
   if z == 2:
      x = j
   print(x, end=" ")

我很感激任何形式的见解。

【问题讨论】:

运行似乎什么都不做的可执行文件的提示:打开命令行,cd 到包含应用程序的目录(良好做法),然后在那里运行可执行文件。您是否看到程序的任何输出或是否立即转到新行? @Timothy Jannace 我忘记在帖子中添加它,我试了一下,我立即得到新行,我将在上面添加它 希望这个链接可以帮助你:***.com/questions/44491802/… @Mohamad 脚本本身就像我上面所说的那样工作,我的问题是可执行文件 您在上面发布的 setup.py 脚本根据他们的教程看起来是正确的。您用于构建可执行文件的确切命令是什么? 【参考方案1】:

去掉这两行

if sys.platform == "win32":
   base = "Win32GUI"

从您的安装脚本中,它应该可以工作。

base = "Win32GUI" 告诉cx_Freeze 不要启动控制台窗口,并且仅应在主应用程序启动 GUI 时使用(例如,使用 PySide、PyQt、Tk...)。如果您从已经启动的控制台运行可执行文件,它可能还会将标准输出重定向到控制台之外。在您的情况下,您有一个基于控制台的应用程序,因此您希望启动一个控制台并接收标准输出。 cx_Freeze documentation 部分解释了这种行为。

现在,如果您在不使用 cmd 的情况下运行可执行文件(例如,通过在 Windows-Explorer 中双击它),它会启动一个控制台窗口,在那里打印输出,并在执行完成后立即关闭控制台。在您的示例脚本中,您希望有时间在控制台关闭之前阅读输出,因此您需要告诉您的脚本在完成之前等待,例如直到您按下一个键。你可以添加

input("Press Enter to continue...")

为此目的,在您的脚本末尾,请参阅How do I make python to wait for a pressed key。

【讨论】:

感谢您的建议,它现在可以与 cmd 一起使用,有没有办法在不使用 cmd 的情况下执行它? @Noah 如果我正确理解您的评论,当您在不使用 cmd 的情况下运行可执行文件(即在 Windows-Explorer 中双击它)时,它会启动一个控制台窗口,在那里打印输出,并在执行完成后立即关闭控制台。然后你需要的是告诉你的脚本等到你按下一个键后再完成。为此,您可以在脚本末尾添加input("Press Enter to continue..."),请参阅this question。 谢谢,按预期工作,非常感谢您可以将其添加到您的答案中以便我正式接受吗? @Noah 很好用。我已经相应地编辑了我的答案。【参考方案2】:

在代码之后添加等待,使其不会立即完成。

import random
import string

for i in range(20):
   k = random.choice(string.ascii_letters)
   j = random.randint(0, 9)
   z = random.randint(1, 2)
   if z == 1:
      x = k
   if z == 2:
      x = j
   print(x, end=" ")

import time
time.sleep(5)   #<-- Sleep for 5 seconds

你也可以使用我的Python Executable maker。

【讨论】:

以上是关于使用 cx_Freeze 执行的 Python 脚本,exe 啥也不做的主要内容,如果未能解决你的问题,请参考以下文章

可执行文件 = 可执行文件 python 错误(尝试使用 cx_freeze 将 pygame 转换为可执行文件)

记录使用cx_Freeze打包Python成exe可执行程序

如何减少 cx_Freeze 编译的 Python 可执行文件大小?

尝试使用 cx_freeze 将 python 文件转换为可执行文件时出错

使用 python 3.7 PyQt5 和 cx_Freeze 创建可执行文件,但 DLL 无法加载

使用 cx_Freeze 冻结成可执行文件后如何知道当前文件路径?