2017-06-29 267 views
1

我有一個成功運行的Python程序。如果我改變這一行:什麼是subprocess.Popen這樣做可能會導致「軟件導致連接中止」?

os.system("ls /path") 

這樣:

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

然後ls命令生成以下錯誤:

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

是什麼樣的運行ls的這兩種方法有什麼不同?

N.B. /path是我正在測試的FUSE文件系統的掛載點。我確信這是相關的,因爲當我看到ls命令指向非FUSE路徑時,上述兩種情況之間沒有區別。但是Python的做法與ls觸發不同的行爲有什麼不同呢?

這是Ubuntu 16.04上的Python 3.5。

+0

''軟件引起的連接中斷''聽起來像是FUSE的套接字出了問題。出現此錯誤後,您的文件系統是否仍然安裝並運行? –

回答

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()調用熔絲文件系統時記錄傳入請求。

另一個有趣的提示是錯誤消息,它看起來像一個套接字相關的錯誤。

相關問題