2017-06-29 270 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()调用熔丝文件系统时记录传入请求。

另一个有趣的提示是错误消息,它看起来像一个套接字相关的错误。

相关问题