5

This may be a super simple question. I am calling a Python script on an Lubuntu OS (Cubietruck) via a shell script. This is to automate the process on start up (I want to maintain this process). Is there a simple way to view the output from Python? At the moment the Python script runs in the background, with no terminal. I have some errors that need checking. The script is:

#!/bin/sh
python recordSound.py

Thanks in advance.

4
  • Does python recordSound.py produce any output when you run it on the command line directly? Commented Jul 10, 2014 at 9:37
  • 3
    Add logging to your script, and then read the logs. Commented Jul 10, 2014 at 9:41
  • Hi Miquel, Yes it does. I have a number of print statements / exceptions to catch progress and errors. Commented Jul 10, 2014 at 9:43
  • Hi Burhan, I thought of logging output but wanted to check things in real time if possible as this a script that runs at start up and triggers other applications plus hardware. It also will be a headless unit that I will VNCing into at the beginning so I want to see progress early on. Thanks for the suggestion though. It may be the way forward. Commented Jul 10, 2014 at 9:46

5 Answers 5

8

The proper solution would probably use logging as proposed in a comment.

In the meantime, you have to redirect both the standard output and the standard error stream in order to capture the normal output as wall as any error reported by your script:

#!/bin/sh
python recordSound.py >> logfile.log 2&>1

See one of the many web pages on that topic to explore the various redirection available from a shell script.


In addition, if you need both login and live view on the console, use the tee standard command:

#!/bin/sh
python recordSound.py 2&>1 | tee logfile.log
Sign up to request clarification or add additional context in comments.

1 Comment

I guess it is 2>&1 ref. askubuntu.com/a/625230/22308
2

Call your script directly. Just like you call bash script with a shebang (#!) you can call your python script with a #!/bin/env python. Then all you need to do is giving executable permission via chmod +x yourscript.py and calling your script directly like an application. This way, you can see the error codes. Another way to do is using logger module, which is great to see tracebacks and debug info.

1 Comment

I have tried this, but with no joy. It may be my PATH. The general consensus is to go for the logger approach.
1

In your python code you may need to add flush=True to get the print message visible immediately when run thru .sh

print('your message', flush=True)

Comments

0

A very easy way would to redirect output from your script to a file

#!/bin/sh
python recordSound.py >> logfile.log

See the docs on IO redirection

Comments

0

I'm no bash expert, but I think this should work, as python prints on the standart output unless told otherwise :

#!/bin/sh
python recordSound.py >> /tmp/my_python_log.txt

will add lines each time python outputs stuff. Go to the path specified to read the result. If you want a live view, use pipes '|' to redirect the output.

Edit : for a live view, you can also use the "tail -f /tmp/my_python_log.txt" command on another terminal as the other solution is running, which will first print the last 10 lines or so in the file, then automatically add new lines added. I love this command, really handy to view activity on a small Apache server. You can even watch multiple logs at once !

4 Comments

After reading Burhan's comment, I'd say his solution is more robust and efficient / right way of doing things, but for a small script, manual redirection, the lazy way, using bash to simplify everything even if it looks pointless to print via python then redirect when you can directly log from python, is better because you can easily go from "logging" to "live output" by removing the '|' or '>>'.
But don't forget that logging can produce standard output or error output if so configured ...
Yes, but it requires to read its manual, I often go for simple generic non-efficient solutions because I know for sure how they behave in each and every situation. I might slightly be reinventing the wheel but at least my wheel won't randomly throw an exception I don't know about at the 500th execution.
Fair enough - I too try to follow the KISS principle

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.