непонятное поведение subprocess.Popen(cmd,stdout) и os.system(cmd)

Я использую внешнюю команду внутри скрипта Python, используя сначала:

subprocess.Popen(cmd, stdout=subprocess.PIPE)

тогда я получаю стандартный вывод.

Проблема в том, что результат этой внешней команды при выполнении внутри скрипта не тот, если я выполняю ее прямо в командной строке.

Пользуюсь потом os.system(cmd), но та же проблема.

Используют ли эти инструкции в python некоторые буферы?

Как я могу объяснить разницу между двумя результатами (командной строкой и внутри скрипта).

Я использую этот инструмент как локальную команду из командной строки после его установки:

https://potassco.org/clingo/run/

Я использую некоторый файл в качестве входных данных, например этот:

edge("s1","s3").

edge("s2","s4").

edge("s3","s4").

path(X,Y) :- edge(X,Y). % x and y are strings

path(X,Z) :- path(X,Y), path(Y,Z).

:- path(X,Y), path(Y,X). %cyclic path.

Для этого инструмент создает такую ​​модель:

edge("s1","s3") edge("s2","s4") edge("s3","s4") path("s1","s3") path("s2","s4") path("s3","s4") path("s1","s4")
SATISFIABLE

Когда я вызываю команду внутри своего скрипта Python, она не вычисляет всю модель, а создает неполную модель. Эта проблема появляется только в больших примерах, которые требуют вычисления большой модели. Вот почему я спрашиваю, используют ли эти команды: subprocess.Popen и os.system некоторые буферы...


person Inzo. Geo    schedule 18.09.2018    source источник
comment
Не могли бы вы уточнить команду и в чем различия?   -  person Mateo Torres    schedule 19.09.2018
comment
Разница в выводе, у меня есть команда, которая генерирует вывод в файл. Например, когда я выполняю команду напрямую, она генерирует файл размером 10 КБ, но если я вызываю ее внутри скрипта Python, она дает мне файл размером 8 КБ. Когда я просматриваю вывод, я сообщаю, что он пропустил некоторые выводы, я не понимаю, почему!   -  person Inzo. Geo    schedule 19.09.2018
comment
Это может зависеть от используемой вами команды, из какой среды она работает, каков ее текущий рабочий каталог и множества других вещей. Вы предоставили недостаточно информации, чтобы мы могли точно определить проблему.   -  person zwer    schedule 19.09.2018
comment
Я использую этот инструмент как локальную команду после его установки: potassco.org/clingo/run.   -  person Inzo. Geo    schedule 19.09.2018
comment
@zwer я отредактировал свой пост, пожалуйста, посмотрите сейчас   -  person Inzo. Geo    schedule 19.09.2018
comment
@torresmateo я отредактировал свой пост, пожалуйста, посмотрите сейчас   -  person Inzo. Geo    schedule 19.09.2018
comment
Это пахнет проблемой буферизации. Не могли бы вы предоставить код для чтения вывода команды subprocess.Popen? Это может иметь значение.   -  person tkrennwa    schedule 27.09.2018
comment
Как получить стандартный вывод? С помощью метода общаться()?   -  person peschü    schedule 27.09.2018
comment
@tkrennwa: p = subprocess.Popen(cmd, stdout=subprocess.PIPE), а True: output = str(p.stdout.readline().decode(utf-8)) res += output   -  person Inzo. Geo    schedule 28.09.2018
comment
Как написано в документации для Popen: bufsize будет предоставлено в качестве соответствующего аргумента функции open() при создании файловых объектов канала stdin/stdout/stderr. Буфер по умолчанию соответствует системным настройкам буферизации. Кроме того: предупреждение: используйте communicate() вместо .stdin.write, .stdout.read или .stderr.read, чтобы избежать взаимоблокировок из-за заполнения любого другого буфера канала ОС и блокировки дочернего процесса.   -  person tkrennwa    schedule 06.10.2018