Ошибка подпроцесса PyDev / Python3.1 - кодировка не объявлена - PullRequest
0 голосов
/ 27 декабря 2011

Когда я запускаю Parent.py , который вызывает подпроцесс child.exe, возникает следующая ошибка

  File "child.exe", line 1
SyntaxError: Non-UTF-8 code starting with '\x90' in file child.exe on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

Если я запускаю Parent.py с child.py , выполнение успешно возвращает «Hello from parent».из Eclipse.

Если я запускаю Parent.py из поставляемого IDLE, ничего не возвращается в случае обоих child.exe и child.py

Я прочитал документацию http://python.org/dev/peps/pep-0263/ и понял ее, возможно, неправильно понял, что это означает, что я должен добавить предложенные комментарии, которые я пытался добавить в child.exe ... они не работали. Parent.py

import os
import subprocess
import sys

if sys.platform == "win32":
    import msvcrt
    import _subprocess
else:
    import fcntl

# Create pipe for communication
pipeout, pipein = os.pipe()

# Prepare to pass to child process
if sys.platform == "win32":
    curproc = _subprocess.GetCurrentProcess()
    pipeouth = msvcrt.get_osfhandle(pipeout)
    pipeoutih = _subprocess.DuplicateHandle(curproc, pipeouth, curproc, 0, 1,
            _subprocess.DUPLICATE_SAME_ACCESS)

    pipearg = str(int(pipeoutih))  
else:
    pipearg = str(pipeout)

    # Must close pipe input if child will block waiting for end
    # Can also be closed in a preexec_fn passed to subprocess.Popen
    fcntl.fcntl(pipein, fcntl.F_SETFD, fcntl.FD_CLOEXEC)

# Start child with argument indicating which FD/FH to read from
subproc = subprocess.Popen(['python', 'child.exe', pipearg], close_fds=False)

# Close read end of pipe in parent
os.close(pipeout)
if sys.platform == "win32":
    pipeoutih.Close()

# Write to child (could be done with os.write, without os.fdopen)
pipefh = os.fdopen(pipein, 'w')
pipefh.write("Hello from parent.")
pipefh.close()

# Wait for the child to finish
subproc.wait()

Child.exe (заморожено с помощью cx_freeze)

import os, sys


if sys.platform == "win32":
    import msvcrt

# Get file descriptor from argument
pipearg = int(sys.argv[1])
if sys.platform == "win32":
    pipeoutfd = msvcrt.open_osfhandle(pipearg, 0)
else:
    pipeoutfd = pipearg

# Read from pipe
# Note:  Could be done with os.read/os.close directly, instead of os.fdopen
pipeout = os.fdopen(pipeoutfd, 'r')
print(pipeout.read())
pipeout.close()

1 Ответ

2 голосов
/ 27 декабря 2011
subprocess.Popen(['python', 'child.exe', pipearg], ...

Проблема в том, что вы пытаетесь заставить python читать двоичный файл, если child.exe - это обычный исполняемый файл Windows.Ошибка возникает из-за того, что байты двоичных файлов не соответствуют стандарту ascii - utf8, поэтому интерпретатор не может их прочитать.

Возможно, вам нужно просто выполнить child.exe, просто удалить питонстрока из него:

subprocess.Popen(['child.exe', pipearg], ...
...