Получить вывод подпроцесса без мусора

В компиляторе Transcrypt Python to JavaScript я использую следующий код для передачи данных через подпроцесс:

                process = subprocess.Popen (
                    [node.args [1] .s],
                    shell = True,
                    stdin = subprocess.PIPE,
                    stdout = subprocess.PIPE
                )
                process.stdin.write (sourceCode.encode ('utf8'))
                process.stdin.close ()
                while process.returncode is None:
                    process.poll ()
                targetCode = process.stdout.read (). decode ('utf8'). replace ('\r\n', '\n')

Мой подпроцесс - это.bat-файл Windows, содержащий:

python capitalize.py

Содержимое файла capitalize.py:

import sys
content = sys.stdin.read ()
sys.stdout.write (content.upper ())

Если переменная sourceCode изначально содержит:

dit
is
een
test

как переменная результата targetCode будет содержать:

    D:\activ_tosh\geatec\transcrypt\qquick\Transcrypt\transcrypt\development\experiments\pipe>python capitalize.py 

    D:\activ_tosh\geatec\transcrypt\qquick\Transcrypt\transcrypt\development\experiments\pipe>call D:\python36_anaconda\python.exe capitalize.py 

        DIT
        IS
        EEN
        TEST

Другими словами, как и следовало ожидать, эхо команд добавляется к стандартному выводу.

Если я запускаю командный файл с echo offэто повторяется, так что это не помогает.

Как я могу изменить код подпроцесса. Открыть (или код, окружающий его) таким образом, чтобы targetCode будет содержать только:

        DIT
        IS
        EEN
        TEST

Я перепробовал много вещей, включая использование echo off в разных местах и ​​переназначение stdout. И я довольно много гуглял, но не нашел решения. Кто-нибудь знает, как это решить?

[EDIT1] @Mahesh Кария

Я пробовал:

                process = subprocess.Popen (
                    [node.args [1] .s],
                    shell = True,
                    stdout = subprocess.PIPE
                )
                print (111)
                targetCode = process.communicate (io.StringIO (sourceCode))[0]
                print (222)

Это зависает после печати 111.

[EDIT1]

Я решил свою проблему, используя исполняемый файл (в переводе с C++) в качестве фильтра, а не.bat или.py файл. Это не генерирует никакого консольного эха.

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main () {
    string buffer;
    getline (cin, buffer, '\f');
    transform (buffer.begin(), buffer.end(), buffer.begin(), ::toupper);
    cout << buffer;
}

Входные данные должны заканчиваться символом завершения, в этом случае я использовал '\f':

'''
<div id="StudentContainer">
    {self.props.students.map((s) => (
        <StudentTile student={s}  key={s.searchval}  />
    ))}
</div>
\f'''

1 ответ

Одним из способов является использование метода connect () для получения выходных данных.

processes = [Popen(cmd, shell=True, stdout=subprocess.PIPE) for cmd in self.cmd_list]
for p in processes: p.wait()
for p in processes:
    output = p.communicate()[0]
    print output
Другие вопросы по тегам