当Python代码被编译为exe文件时,一些Python特有的功能可能不会像在Python解释器中那样工作。特别是与标准输出相关的部分,可能会因为exe文件的限制而变得不可用。
以下是一些可能的解决方案:
使用其他输出方法:尝试使用其他方法打印消息,比如使用文件输出。
1. 检查is_interactive_logging_enabled()的返回值:确保这个函数在编译后的环境中能正确地返回预期的值。
2. 检查你的打包工具:确保你使用的打包工具(如PyInstaller)是最新的,并且与你的Python版本兼容。
3. 尝试不同的打包配置:某些打包配置可能会导致某些Python功能不可用。尝试不同的打包配置或选项可能会解决问题。
4. 查找相关的问题和解决方案:在网上搜索类似的问题,看看是否有其他开发者遇到了相同的问题,并分享了解决方案。
5. 考虑不使用标准输出:如果可能的话,考虑不使用标准输出,而是将消息存储在一个变量中,然后在需要的时候使用其他方法打印或记录这个变量。
造成的原因
深度学习库keras训练或者预测时,迭代的信息是python的标准输出,然而C#封装的exe,因为没有控制台,所以导致结果无法输出;
另外,通过pyinstaller -F -w封装的Demo会出现相同的情况
实际解决方案
python解决方案
pyinstaller -F封装,这种带有控制台的方式可以兼容上面问题。
C#解决方案
需要在python源码中进行更改,通过将标准输出,转空或者写入日志中,可以解决如上问题,代码如下:
方案一:通过将标准输出,转空
@contextmanager
def suppress_stdout():
with open(os.devnull, 'w') as devnull:
old_stdout = sys.stdout
sys.stdout = devnull
try:
yield
finally:
sys.stdout = old_stdout
# 将需要解决的代码块放到下面
with suppress_stdout():
model.prediect()
方案二:通过将标准输出的信息写入日志中
log_file = open('./log//train_log.txt', 'w')
with redirect_stdout(log_file):
model.prediect()
log_file.close()
python 环境移植
1. 打包环境
pip freeze >requirements.txt
2.进入python解释器存放packages的位置,将环境下载到指定文件夹中packages
pip download -r requirements.txt -d packages