我在使用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]
)
为什么程序不向控制台打印任何内容?
答案 0 :(得分:0)
问题与 argparse 无关......最后我尝试打印__name__
的内容。看来,如果直接从Python解释器运行,变量包含'__main__'
,但
变量__name__
作为cx_Freeze编译的EXE运行时,包含'nameofthegeneratedexe__main__'
字符串。
将第if __name__ == "__main__":
行(上面的清单中的第5行)更改为:
if "__main__" in __name__:
解决了这个问题。