You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

2to3-3.6转换动态生成Python2代码时出现挂起问题求助

故障原因分析
  • 第一个原因是你调用2to3-3.6时传入了无效的目标文件/dev/null:2to3会遍历所有传入的路径做语法转换,3.6版本的2to3处理/dev/null这类特殊字符设备文件时,会出现IO读取异常导致进程挂起。你不需要处理其他文件的话,直接删掉这个参数即可。
  • 第二个原因是转换后代码执行阻塞,你误以为是2to3挂起:2to3输出你贴的那两行日志的时候已经处理完x.py的转换了,后续执行subprocess.check_output(["python3", 'x.py'])时,转换后的代码里有input()语句需要读取用户输入,而check_output默认不会继承当前进程的stdin,也没有预传入输入内容,进程就会一直卡在等待输入的状态。
其他代码错误点
  • 调用subprocess.run执行rm命令时参数格式错误:subprocess执行命令要求所有参数放在同一个列表中,你当前的写法subprocess.run("rm", "-rf" ,"x.py")会直接抛出参数异常,正确写法是subprocess.run(["rm", "-rf", "x.py"])。
  • 写入x.py时用了追加模式a:如果运行前x.py已有内容,会导致拼接后的代码语法错误,建议换成覆盖模式w。
修复后可运行代码
python_code = """
def greet(name):
    print("Hello, {0}!".format(name))
print "What's your name?"
name = raw_input()
greet(name)
"""
# 改用覆盖模式写文件
with open('x.py', 'w') as the_file:
    the_file.write(python_code)
import subprocess
# 去掉无效的/dev/null参数
subprocess.run(["2to3-3.6", "-w", 'x.py'])
# 给input传入测试内容,避免阻塞
op = subprocess.check_output(["python3", 'x.py'], input=b"test_user\n")
# 修正subprocess参数格式
subprocess.run(["rm", "-rf" ,"x.py"])
subprocess.run(["rm", "-rf" ,"x.py.bak"])
print(op.decode())

内容的提问来源于stack exchange,提问作者vector8188

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 00:15:02