打包exe出错了:

打包exe出错了:
Traceback (most recent call last):
File "huu.py", line 6, in
n = int(input('enter:'))
RuntimeError: input(): lost sys.stdin

源码:

python
print('判断一个数是否为素数')
print()

while True:
	print('请输入一个大于1的数:')
	n = int(input('enter:'))
	yn = True
	for i in range(2, n):
		if n % i == 0:
			yn = False
			break

	if yn == True:
		print(n, '\r是素数', flush = True)
	else:
		print(n, '\r是合数', flush = True)
	print()

----

您遇到的错误是由于在打包成可执行文件(如exe)时,标准输入流(sys.stdin)在非控制台环境中丢失导致的。以下是解决方案和优化建议:

原因分析

  1. 打包工具特性:PyInstaller等工具在打包GUI应用时默认隐藏控制台,导致input()无法使用。
  2. 输入流丢失:打包后sys.stdin可能被关闭或重定向。

解决方案

方法一:强制显示控制台(推荐)

在打包命令中添加--console参数:

pyinstaller --console your_script.py

方法二:代码适配

修改输入方式,兼容控制台和打包环境:

import sys

def safe_input(prompt):
    try:
        return input(prompt)
    except EOFError:
        return ""
    except RuntimeError:
        print("输入功能在打包环境中不可用")
        return None

# 替换原代码中的input()
n = safe_input('请输入大于1的数:')

优化建议

  1. 输入验证:增加输入有效性检查
while True:
    try:
        n = int(safe_input('请输入大于1的数:'))
        if n <= 1:
            print("请输入大于1的数")
            continue
        break
    except ValueError:
        print("请输入有效数字")
  1. 算法优化:提升素数判断效率(减少循环次数)
def is_prime(n):
    if n < 2:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False
    # 只需检查到平方根
    for i in range(3, int(n**0.5)+1, 2):
        if n % i == 0:
            return False
    return True

完整修改后的代码

import math
import sys

def safe_input(prompt):
    try:
        return input(prompt)
    except (EOFError, RuntimeError):
        return None

def is_prime(n):
    if n < 2:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False
    # 只需检查到平方根
    for i in range(3, int(math.isqrt(n)) + 1, 2):
        if n % i == 0:
            return False
    return True

while True:
    user_input = safe_input('请输入大于1的数(输入q退出):')
    if user_input is None or user_input.lower() == 'q':
        break
    
    try:
        n = int(user_input)
        if n <= 1:
            print("请输入大于1的数")
            continue
    except ValueError:
        print("请输入有效数字")
        continue
    
    result = is_prime(n)
    print(f"{n} 是 {'素数' if result else '合数'}")
    print()

打包注意事项

  1. 使用以下命令打包:
pyinstaller --clean --console --name PrimeChecker prime_checker.py
  1. 如果仍有问题,尝试添加输入流补丁:
pyinstaller --console --hidden-import=tokenize your_script.py

这些修改确保:

  • 兼容控制台和打包环境
  • 输入更健壮
  • 算法效率提升(时间复杂度从O(n)降到O(√n))
  • 添加退出选项
  • 更好的错误处理

请尝试修改后重新打包,应该能解决sys.stdin丢失的问题。

posted @ 2025-10-27 21:12  nxhujiee  阅读(5)  评论(0)    收藏  举报