Ryan
Ryan

Reputation: 10109

using bash command script in python

I have a python script which when run, logs information on the terminal, i want to send this logging information to a text file,

To achieve this in the beginning of the file i am inserting

import subprocess
subprocess.call(['script', 'logfile'])

and at the end of the file,i put in,

subprocess.call(['exit'])

The problem with this is when it calls the first commandscript logfile,it terminates the script,

Any suggestions on how i could make this work would be really helpful,Thanks in advance

Upvotes: 1

Views: 813

Answers (2)

chepner
chepner

Reputation: 531155

The problem is that subprocess.call isn't returning until the shell spawned by script exits, at which point your Python script will resume.

The simplest way to do what you want is to call script itself with your Python script as an argument. Instead of

#!/usr/bin/python

import subprocess

subprocess.call(['script', 'logfile'])

# Rest of your Python code

subprocess.call(['exit'])

you will use

#!/usr/bin/python

import os
import sys

if '_underscript' not in os.environ:
    os.environ['_underscript'] = "yes"
    cmd_args = ['script', 'logfile', 'python'] + sys.argv
    os.execvp('script', cmd_args)

# Rest of your Python code

The environment variable prevents your script from entering an infinite loop of re-running itself with script. When you run your Python script, it first checks its environment for a variable that should not yet exist. If it doesn't, it sets that variable, then runs script to re-run the Python script. execvp replaces your script with the call to script; nothing else in the Python script executes. This second time your script runs, the variable _underscript does exist, meaning the if block is skipped and the rest of your script runs as intended.

Upvotes: 2

chuckwired
chuckwired

Reputation: 147

Seems like that's the expected behaviour of subprocess.call(...). If you want to capture the output of the script to a file, you'll need to open a new file handler in write mode, and tell the subprocess.call where to direct the stdout, which is the terminal output you typically would see.

Try:

import subprocess
f = open('/tmp/mylogfile.log', 'w')
subprocess.call(['/path/to/script'], stdout=f)
f.close()

Then in the terminal you can run tail /tmp/mylogfile.log to confirm.

I'm not sure the last exit call is required for what you're trying to achieve.

You can read more in the python docs, depending which version of Python you're using. https://docs.python.org/2/library/subprocess.html

The file doesn't need to pre-exist. Hope that helps!

Upvotes: -1

Related Questions