cx_Freeze生成的EXE打印没有控制台输出

时间:2016-12-01 13:42:12

标签: python cx-freeze

我在使用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]
)

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

1 个答案:

答案 0 :(得分:0)

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

变量__name__作为cx_Freeze编译的EXE运行时,包含'nameofthegeneratedexe__main__'字符串。

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

if "__main__" in __name__:

解决了这个问题。