2015-05-26 3 views
0

У нас есть два сценария python, которым необходимо обмениваться данными по stdin/out (в Windows). К сожалению, оба они должны быть в разных версиях Python. Фрагменты являются:Передача двоичного файла из Python3 в Python2 в Windows

Источник (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) 

Target (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

Вы пытались использовать «Popen» с трубами и разговаривали с ним «общаться»? https://docs.python.org/2/library/subprocess.html#subprocess.Popen – theodox

+0

Вызов 'setmode' в' to_json' является избыточным, поскольку аргумент '-u' устанавливает' stdin' в двоичный режим. Передача 'env = os.environ', вероятно, избыточна, если только' os.environ' каким-то образом не синхронизируется с рабочей средой. – eryksun

ответ

3

После первого source_file.read() для определения длины файла указатель файла находится в конце файла. К тому моменту, когда вы передали поток до check_call(), вы исчерпали его, и в дальнейшем чтение приведет к пустой строке. Это можно обойти двумя способами:

A. Прочитайте файл в памяти перед вычислением его длины.

B. Перед check_call() перемотайте файл-объект в начало файла с помощью source_file.seek(0).

+0

Спасибо. Тогда похоже, что все данные получены штрафом. – abergmeier