打包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)在非控制台环境中丢失导致的。以下是解决方案和优化建议:
原因分析
- 打包工具特性:PyInstaller等工具在打包GUI应用时默认隐藏控制台,导致
input()无法使用。 - 输入流丢失:打包后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的数:')
优化建议
- 输入验证:增加输入有效性检查
while True:
try:
n = int(safe_input('请输入大于1的数:'))
if n <= 1:
print("请输入大于1的数")
continue
break
except ValueError:
print("请输入有效数字")
- 算法优化:提升素数判断效率(减少循环次数)
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()
打包注意事项
- 使用以下命令打包:
pyinstaller --clean --console --name PrimeChecker prime_checker.py
- 如果仍有问题,尝试添加输入流补丁:
pyinstaller --console --hidden-import=tokenize your_script.py
这些修改确保:
- 兼容控制台和打包环境
- 输入更健壮
- 算法效率提升(时间复杂度从O(n)降到O(√n))
- 添加退出选项
- 更好的错误处理
请尝试修改后重新打包,应该能解决sys.stdin丢失的问题。

浙公网安备 33010602011771号