我们有两个python脚本,需要通过stdin / out(在Windows上)进行通信。可悲的是,他们都必须使用不同的Python版本。这些片段是:
来源(Python 3):
sys.stderr.write("LEN1: %s\n" % len(source_file.read()))
subprocess.check_call(["C:\\python2.exe", "-u", "-c",
"""
import foo
foo.to_json()
"""], stdin=source_file, stdout=json_file, stderr=sys.stderr, env=os.environ)
目标(Python 2):
def to_json():
import msvcrt
msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
input_message = sys.stdin.read()
sys.stderr.write("LEN2: %s\n" % len(input_message))
当我执行脚本时,我得到:
LEN2: 0
LEN1: 37165
好像我在做一些根本错误的事情,但无法弄清楚究竟是什么。任何人都可以尝试帮我调试,我出错了。
答案 0 :(得分:3)
在第一个source_file.read()
确定文件的长度后,文件指针位于文件的末尾。当您将流传递给check_call()
时,您已经耗尽它,并且进一步读取将产生空字符串。这可以通过两种方式解决:
一个。在计算文件长度之前将文件读入内存。
B中。在check_call()
之前,使用source_file.seek(0)
将文件对象回滚到文件的开头。