cx_Freeze 生成的 EXE 不打印任何控制台输出

cx_Freeze generated EXE prints no Console output

我在使用 cx_Freeze 5.0 编译 Python 脚本时遇到困难。 脚本编译正确,生成EXE。在满足所有要求之前,控制台打印了一系列错误消息。 添加所有要求后,运行 运行 EXE 不会向控制台 输出任何内容。程序静默停止,不打印任何内容。 如果 运行 直接来自 Python 它按预期工作:

>python testScript.py -p 12 aaa/bbb.ccc
Test script with the following params:
Namespace(input_file='aaa/bbb.ccc', param=12)

我认为这个问题与我使用的 argparse 包有关。

下面是我编写的一个小测试脚本和编译脚本,可重现该行为。

from sys import exit, argv
import os
import argparse

if __name__ == "__main__":   
    parser = argparse.ArgumentParser(prog=os.path.basename(argv[0]),
        description='Command line parser test.')
    parser.add_argument('input_file',
                        metavar='path/to/file',
                        help='path to source file)')
    parser.add_argument('-p','--param', required=False,
                        metavar='par',
                        type=int, default=1,
                        help='test parameter')

    try:
        args = parser.parse_args()
    except argparse.ArgumentError:
        exit("Use -h option for help on using.")

    if args.input_file is None:
        parser.print_usage()
        exit(0)

#%% display parameters
    print "Test script with the following params:"
    print args

cx_Freeze编译脚本:

from cx_Freeze import version, setup, Executable
import sys

print "Compilation using cx_Freeze version", version

productName = "testScript"

build_exe_options = {"packages": ["sys","os","argparse"]}

exe_options = Executable(
                          script = productName+".py",
                          targetName = productName+".exe",
                          base = None
                         )
setup(
      name=productName,
      version="0.0",
      author="mstankie",
      description="test script",
      options = {"build_exe": build_exe_options},
      executables=[exe_options]
)

为什么程序不向控制台打印任何内容?

问题与 argparse 无关...最后我尝试打印 __name__ 的内容。看起来,如果 运行 直接来自 Python 解释器,变量包含 '__main__',但是

变量__name__当运行作为cx_Freeze-compiledEXE,包含'nameofthegeneratedexe__main__'字符串。

将行 if __name__ == "__main__":(上面清单中的第 5 行)更改为:

if "__main__" in __name__:

解决了问题。