python或者c#封装的exe,报错Attrubuterror:‘Nonetype’object has no attribute write

当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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值