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
2 Answers 2
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.
5 Comments
python3 server.py on the terminal , i keep getting the same behaviour as before meaning it doesnt run my script,Kindly let me know if i am missing something here,Thanksscript runs is not the same shell from which you started the Python script.if '_underscript' block replaces the need for your call to subprocess.call(['script']). Are you running script twice?script logfile python yourScript.py ... instead of python yourScript.py ....cmd_args = ['script', 'logfile', 'python'] + sys.argv could be improved to cmd_args = ['script', 'logfile', sys.executable] + sys.argvSeems 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!
3 Comments
subprocess.call we're telling the stdout (in the terminal this is your standard out i.e. the text you see after executing a command) to write to variable f which is that file. If you want the input too, you can add another argument stdin=f (where stdin means standard input) theoretically. As I've said, you can read the docs to check exactly how to do this.
script logfiledirectly?script logfilefirst and then run my script,That works! but i want it it integrated in my main script,if i run it separately,first i have to runscript logfileon the terminal ,then run my script and after its done,runexit.