【问题标题】:What is subprocess.Popen doing that could result in "Software caused connection abort"?什么是 subprocess.Popen 这样做可能导致“软件导致连接中止”?
【发布时间】:2017-12-03 08:36:57
【问题描述】:

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

os.system("ls /path")

到这里:

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

那么ls命令产生如下错误:

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

这两种运行ls的方法有什么不同?

注意/path 是我正在测试的 FUSE 文件系统的挂载点。我确信这是相关的,因为当ls 命令指向非 FUSE 路径时,我观察到上述两种情况之间没有区别。但是 Python 做了什么不同的事情来让ls 触发不同的行为?

这是 Ubuntu 16.04 上的 Python 3.5。

【问题讨论】:

  • Software caused connection abort 听起来 FUSE 的插座出了点问题。出现此错误后,您的文件系统是否仍然挂载和运行?

标签: python subprocess 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")

此外,您可以考虑在您的 fuse 文件系统的 getattr() 调用中记录传入请求。

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

【讨论】:

    猜你喜欢
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 2011-01-04
    • 1970-01-01
    • 2019-07-28
    • 2016-09-11
    相关资源
    最近更新 更多