Python子进程"对象没有属性'fileno'"错误

epo*_*olf 7 python subprocess pipe

当使用Python 2.5.1运行时,此代码生成"AttributeError:'Popen'对象没有属性'fileno'"

码:

def get_blame(filename): 
    proc = []
    proc.append(Popen(['svn', 'blame', shellquote(filename)], stdout=PIPE))
    proc.append(Popen(['tr', '-s', r"'\040'"], stdin=proc[-1]), stdout=PIPE)
    proc.append(Popen(['tr', r"'\040'", r"';'"], stdin=proc[-1]), stdout=PIPE)
    proc.append(Popen(['cut', r"-d", r"\;", '-f', '3'], stdin=proc[-1]), stdout=PIPE)
    return proc[-1].stdout.read()
Run Code Online (Sandbox Code Playgroud)

堆:

function walk_folder in blame.py at line 55
print_file(os.path.join(os.getcwd(), filename), path)

function print_file in blame.py at line 34
users = get_blame(filename)

function get_blame in blame.py at line 20
proc.append(Popen(['tr', '-s', r"'\040'"], stdin=proc[-1]), stdout=PIPE)

function __init__ in subprocess.py at line 533
(p2cread, p2cwrite,

function _get_handles in subprocess.py at line 830
p2cread = stdin.fileno()
Run Code Online (Sandbox Code Playgroud)

这段代码应该是python docs描述这种用法.

S.L*_*ott 10

三件事

首先,你的()错了.

其次,结果subprocess.Popen()是进程对象,而不是文件.

proc = []
proc.append(Popen(['svn', 'blame', shellquote(filename)], stdout=PIPE))
proc.append(Popen(['tr', '-s', r"'\040'"], stdin=proc[-1]), stdout=PIPE)
Run Code Online (Sandbox Code Playgroud)

proc[-1]不是文件,而是包含文件的进程.

proc.append(Popen(['tr', '-s', r"'\040'"], stdin=proc[-1].stdout, stdout=PIPE))
Run Code Online (Sandbox Code Playgroud)

第三,不要在shell中做所有这些trcut垃圾,很少有东西可能会慢.用Python 编写trcut处理 - 它更快更简单.