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__:
解决了问题。
我在使用 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__:
解决了问题。