Home > Back-end >  bash command wont run in python3
bash command wont run in python3

Time:05-25

I made a python3 script and i need to run a bash command to make it work. i have tried os.system and subprocess but neither of them fully work to run the whole command, but when i run the command by itself in the terminal then it works perfect. what am i doing wrong?

os.system("fswebcam -r 640x480 --jpeg 85 -D 1 picture.jpg &> /dev/null")
os.system("echo -e "From: [email protected]\nTo: [email protected]\nSubject: package for ryan\n\n"package for ryan|uuenview -a -bo picture.jpg|sendmail -t")

or

subprocess.run("fswebcam -r 640x480 --jpeg 85 -D 1 picture.jpg &> /dev/null")
subprocess.run("echo -e "From: [email protected]\nTo: [email protected]\nSubject: package for ryan\n\n"package for ryan|uuenview -a -bo picture.jpg|sendmail -t")

This is supposed to take a picture and email it to me. With os.command it gives an error "the recipient has not been specified "(even though it works perfect in terminal by itself) and with subprocess it doesnt run anything

CodePudding user response:

Best Practice: Completely Replacing the Shell with Python

The best approach is to not use a shell at all.

subprocess.run([
    'fswebcam',
    '-r', '640x480',
    '--jpeg', '85',
    '-D', '1',
    'picture.jpg'],
  stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)

Doing this with a pipeline is more complicated; see https://docs.python.org/3/library/subprocess.html#replacing-shell-pipeline, and many duplicates already on this site.


Second Choice: Using sh-compatible syntax

echo is poorly defined by the POSIX sh standard (the standard document itself advises against using it, and also fully disallows -e), so the reliable thing to do is to use printf instead.

Passing the text to be sent as a literal command-line argument ($1) gets us out of the business of figuring out how to escape it for the shell. (The preceding '_' is to fill in $0).

subprocess.run("fswebcam -r 640x480 --jpeg 85 -D 1 picture.jpg >/dev/null 2>&1",
               shell=True)

string_to_send = '''From: [email protected]
To: [email protected]
Subject: package for ryan

package for ryan
'''
p = subprocess.run(
  [r'''printf '%s\n' "$1" | uuenview -a -bo picture.jpg | sendmail -t''',
   "_", string_to_send],
  shell=True)
  • Related