Noob123
Noob123

Reputation: 548

Ouputting the results of os.popen()

I am trying to send the results of os.popen() to an output file. Here is the code I have been trying

import os

cmd = 'dir'
fp = os.popen(cmd)
print(fp.read())  --Prints the results to the screen
res = fp.read()

fob = open('popen_output.txt','w')
fob.write(res)
fob.close()

fp.close()

The output file is just blank. The results of the command are however displayed on screen. I have also tried using Popen like this (as per the subprocess management documentation):

import subprocess

fob = Popen('dir',stdout='popen_output.txt',shell=true).stdout

As well as:

import subprocess

subprocess.Popen('dir',stdout='popen_output.txt,shell=true)

Upvotes: 2

Views: 3602

Answers (4)

foundling
foundling

Reputation: 1756

The problem is you are calling fp.read() twice instead of saving the results of a single fp.read() call as res, printing res, and writing the res to the output file. A file handle is stateful, so if you call read on it twice, the current position after the first call will be at the end of the file/stream, hence your blank file.

Try this (just providing the relevant changes):

fp = os.popen(cmd)
res = fp.read()
print(res)

Upvotes: 0

Noob123
Noob123

Reputation: 548

Ok. This got it going. Thanks for the help!

fob = open('popen_output.txt','a')
subprocess.Popen('dir',stdout=fob,shell=True)
fob.close()

Upvotes: 2

Programmer
Programmer

Reputation: 293

This seems to be more what you'd like to do. You can process then write to file.

process = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
for line in process.stdout:
    #processing then write line to file...
    file.write(line)

If you don't want to process, then you could just do it in your subprocess call.

subprocess.run('dir > popen_output.txt', shell=true)

Upvotes: 1

Padraic Cunningham
Padraic Cunningham

Reputation: 180441

Pass a file object to stdout not a the file name as a string, you can also use check_call in place of Popen which will raise a CalledProcessError for a non-zero exit status:

with open('popen_output.txt',"w") as f:
      subprocess.check_call('dir',stdout=f)

If you are on windows subprocess.check_call('dir',stdout=f, shell=True), you could also redirect using > using shell=True:

subprocess.check_call('dir > popen_output.txt',shell=True)

Upvotes: 2

Related Questions