Что делает подпроцесс. Открытое действие, которое может привести к "программному обеспечению, вызванному прерыванием соединения"?
У меня есть программа 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.
Другой интересный совет - это сообщение об ошибке, которое выглядит как ошибка, связанная с сокетом.