Reputation: 10109
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
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
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