Получить вывод подпроцесса без мусора
В компиляторе 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