2013-05-12 1 views
0

У меня есть две программы. Сначала один (subprocess.cpp) написана на C++:python stdout.flush() НЕ сбрасывает последние белые символы, такие как ' n'

#include <stdio.h> 

int main() { 

    char * line = new char[1000]; 

    // first scan 
    scanf("%s\n", line); 
    printf("%s\n", line); 
    fflush(stdout); 

    // second scan 
    scanf("%s\n", line); 
    printf("%s\n", line); 
    fflush(stdout); 

    return 0; 
} 

Эта программа просто получает две строки из стандартного ввода и выводит в стандартный вывод на, промывка в конце концов. Вот вторая программа (test.py) написана на Python 2.7:

from subprocess import Popen 
from subprocess import PIPE 
from subprocess import Popen 

# create process 
my_process = Popen("./subprocess", stdin = PIPE, stdout = PIPE) 

# send initial data 
my_process.stdin.write('abc\n') 
my_process.stdin.flush() 
my_process.stdin.write('xyz\n') 
my_process.stdin.flush() 

# read data from subprocess 
print "Subprocess line 1 :: " + str(my_process.stdout.readline()) 
print "Subprocess line 2 :: " + str(my_process.stdout.readline()) 

Этот скрипт должен запустить subproccess, отправить и получить две строки. Посмотрите, что happpening:

[email protected] ~/Desktop/inzynierka $ g++ subprocess.cpp -o subprocess 
[email protected] ~/Desktop/inzynierka $ python test.py 
Subprocess line 1 :: abc 

test.py ждет второй линии от программы subprocess. Программа subprocess не может отправить 2-ю строку, потому что она ждет символа '\ n'.

Если я меняю второй scanf на subprocess.cpp на scanf("%s\n", line); (нет \n) все работает нормально. То же самое происходит, когда я отправить еще одну строку в test.py:

# send initial data 
my_process.stdin.write('abc\n') 
my_process.stdin.flush() 
my_process.stdin.write('xyz\n') 
my_process.stdin.flush() 
my_process.stdin.write('ADDITIONAL\n') 
my_process.stdin.flush() 

Кажется, что Python не посылает последнюю \ п символ после промывки (пример с измененной зсапЕ). Добавление одной дополнительной записи и флеша в test.py доказывает, что отсутствующий символ \ n все еще находится в буфере после флеша.

Что с этим делать? Как сделать флеш Python для очистки всех символов?

ответ

2

Ошибка при сканировании с помощью строк формата \ n i. Он сканирует, что scanf («% s \ n») вернется после первого символа без пробела после \ n при использовании труб или после первой непустой строки при использовании терминала (поскольку первый символ без пробелов будет сброшен после следующего \ n).

Дело в том, что вы, вероятно, не хотели использовать scanf ("% s \ n"). Я думаю, что то, что вы действительно хотите:

scanf("%s%*[^\n]", line); 

, который будет читать слово, затем удалите все символы в одной строке.

+0

Согласен, проблема заключается в использовании '\ n' в строке формата scanf, а не в Python. Фактически, просто 'scanf («% s », строка)' отлично работает или даже 'gets (line)' (в зависимости от намерения). –

+0

Спасибо, я понятия не имел, что проблема не в самом Python. –

1

Проблема с scanf("%s\n", line), вторая scanf() необходимо прочитать другую строку, прежде чем она сможет найти символ без пробелов.

Существует хорошее объяснение для аналогичного случая here.

Я также проверил его с помощью strace, Python отправил последний символ '\n'.

pid 6611: test.py 
pid 6613: subprocess 

> strace -f python test.py 
[pid 6611] write(4, "abc\n", 4 <unfinished ...> 
... 
[pid 6611] write(4, "abc\n", 4 <unfinished ...> 
... 
[pid 6613] read(0, "abc\nxyz\n", 4096) = 8 
... 
[pid 6613] write(1, "abc\n", 4)  = 4 
[pid 6611] <... read resumed> "a", 1) = 1 
[pid 6613] read(0, <unfinished ...> 
[pid 6611] read(5, "b", 1)    = 1 
[pid 6611] read(5, "c", 1)    = 1 
[pid 6611] read(5, "\n", 1)   = 1 
... 
[pid 6611] write(1, "Subprocess line 1 :: abc\n", 25Subprocess line 1 :: abc) = 25 
[pid 6611] write(1, "\n", 1)   = 1 
[pid 6611] read(5,