Subprocess.popen() не работает со Swift

Я хочу subprocess.popen() программу Swift с Python 3.

родитель.py:

import subprocess

#p = subprocess.Popen(['python3', 'sub.py'], universal_newlines = True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.DEVNULL, bufsize=1)

p = subprocess.Popen(['swift', 'sub.swift'], universal_newlines = True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.DEVNULL, bufsize=1)

while True:
    a=input('command:')
    if not a:
        print(p.stdout.readline())
    else:
        p.stdin.write(a+'\n')

sub.swift

while true {
    print(readLine()!)
}

Это не работает. p.stdout.readline() ларьки.

Если я изменю команду на ['python3', 'sub.py'] и получу

sub.py

while True:
    print(input())

Оно работает:

> python3 parent.py
command:a
command:[enter]
a

command:asdf
command:[enter]
asdf

Почему это? Как я могу это решить?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сброс стандартного вывода у меня сработал:

import Darwin
while true {
    print(readLine()!)
    fflush(stdout)
}

Я не слишком знаком с Python, но я предполагаю, что Python print, вероятно, автоматически очищается.

Благодарю вас! Это очень помогло. Можно поподробнее про промывку? Программа не пишет напрямую в стандартный вывод?

John Hao 10.05.2022 11:18

@JohnHao Правильно, в этом конкретном случае стандартный вывод буферизуется (я не знаю, насколько велик буфер), поскольку ваша программа на Python не может ничего читать без сброса. См. также: stackoverflow.com/questions/3723795/…

Sweeper 10.05.2022 13:09

Другие вопросы по теме

Увеличить/уменьшить значение метки двумя кнопками
Как мне сделать закругленный NSBox с размытым фоном?
Загрузка изображения пользователя и сохранение изображения по умолчанию
Обновление всех сообщений текущего пользователя работает, но после регистрации с новой учетной записью обновляется другая учетная запись, которую я создал ранее. iOS Firebase
Внутренняя ошибка сервера — 500. Ссылка на объект не указывает на экземпляр объекта. шаг 0
Ошибка удаления TableViewCell из TableView, использующего CoreData
Использование NSPredicate для фильтрации/нефильтрации разделов в SectionedFetchRequest
Есть ли сокращение if-let one liner?
Как преобразовать строку Swift, созданную с помощью «\ u {ea12}», обратно в ее шестнадцатеричное значение/строку «ea12»?
Как получить «@microsoft.graph.downloadUrl» из json, потому что @ является ключевым словом и не может использоваться для переменных. @microsoft.graph.downloadUrl не может объявить