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
相关产品推荐
相关产品推荐

