Что делает подпроцесс. Открытое действие, которое может привести к "программному обеспечению, вызванному прерыванием соединения"?

У меня есть программа Python, которая успешно работает. Если я изменю эту строку:

os.system("ls /path")

к этому:

subprocess.Popen(["ls /path"], shell=True)

Тогда ls Команда генерирует следующую ошибку:

ls: cannot access '/path': Software caused connection abort

Чем отличаются эти два метода бега? ls?

NB /path точка монтирования файловой системы FUSE, которую я тестирую Я уверен, что это актуально, поскольку я не вижу разницы между двумя вышеупомянутыми случаями, когда ls Команда указывает на путь не FUSE. Но что Python делает по-другому, чтобы получить ls вызвать другое поведение?

Это Python 3.5 на Ubuntu 16.04.

1 ответ

На первый взгляд, оба метода должны быть в основном одинаковыми. Вы можете попробовать запустить strace на обеих версиях и проверьте, какая разница в вашем конкретном случае:

strace -f ./system.py >/dev/null 2> system.strace
strace -f ./popen.py >/dev/null 2> popen.strace

где system.py было бы:

#!/usr/bin/env python3
import subprocess
subprocess.Popen(["ls /path"], shell=True)

а также popen.py:

#!/usr/bin/env python3
import os
os.system("ls /path")

Кроме того, вы можете рассмотреть входящие запросы в getattr() вызов вашей файловой системы fuse.

Другой интересный совет - это сообщение об ошибке, которое выглядит как ошибка, связанная с сокетом.

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