什么是subprocess.Popen这样做可能导致“软件导致连接中止”?

时间:2017-06-29 14:54:53

标签: python subprocess fuse

我有一个成功运行的Python程序。如果我改变这一行:

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路径时,我发现上述两种情况之间没有区别。但是,为了让ls触发不同的行为,Python采取了哪些不同的做法?

这是Ubuntu 16.04上的Python 3.5。

1 个答案:

答案 0 :(得分: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()调用中记录传入的请求。

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