Такой объект никогда не может создаваться на стеке. Всегда на "куче". И удаление должно быть сделано через друга или участника. Продукт может использовать иерархию отдельного объекта и пользовательского диспетчера памяти - такие сценарии могут использовать частный dtor.
#include <iostream>
class a {
~a() {}
friend void delete_a(a* p);
};
void delete_a(a* p) {
delete p;
}
int main()
{
a *p = new a;
delete_a(p);
return 0;
}
Чтобы избежать многих проблем, которые всегда могут возникнуть при буферизации для таких задач, как «передача вывода подпроцесса в основной процесс в реальном времени», я всегда рекомендую использовать pexpect для всех платформ, отличных от Windows, мы ожидаем в Windows вместо подпроцесса
, когда требуются такие задачи.
Очевидно, вы можете использовать subprocess.communicate, но я думаю, что вы ищете ввод и вывод в реальном времени.
readline заблокирован, потому что процесс, вероятно, ожидает вашего ввода. Вы можете читать символ за символом, чтобы преодолеть это, например:
import subprocess
import sys
process = subprocess.Popen(
cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
while True:
out = process.stdout.read(1)
if out == '' and process.poll() != None:
break
if out != '':
sys.stdout.write(out)
sys.stdout.flush()
Фрагмент Нади работает, но вызывает чтение с буфером 1 байт крайне не рекомендуется. Лучший способ сделать это - установить для дескриптора файла stdout неблокирующий режим с помощью fcntl
fcntl.fcntl(
proc.stdout.fileno(),
fcntl.F_SETFL,
fcntl.fcntl(proc.stdout.fileno(), fcntl.F_GETFL) | os.O_NONBLOCK,
)
, а затем использовать select, чтобы проверить, готовы ли данные
while proc.poll() == None:
readx = select.select([proc.stdout.fileno()], [], [])[0]
if readx:
chunk = proc.stdout.read()
print chunk
. Она была права в том, что ваша проблема должна отличаться от той, которую вы опубликовали как Caller.py и Test_Pipe.py работают, как предусмотрено.