This code generates ‘AttributeError: ‘Popen’ object has no attribute ‘fileno” when run with Python 2.5.1
Code:
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()
Stack:
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()
This code should be working the python docs describe this usage.
Three things
First, your ()’s are wrong.
Second, the result of
subprocess.Popen()is a process object, not a file.The value of
proc[-1]isn’t the file, it’s the process that contains the file.Third, don’t do all that
trandcutjunk in the shell, few things could be slower. Write thetrandcutprocessing in Python — it’s faster and simpler.