bash 命令在 python3 中不会 运行

bash command wont run in python3

我制作了一个 python3 脚本,我需要 运行 一个 bash 命令来让它工作。我已经尝试了 os.systemsubprocess 但它们都不能完全工作 运行 整个命令,但是当我 运行 在终端中单独使用命令时它就可以完美运行。我做错了什么?

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

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

这应该是拍张照片发邮件给我吧。使用 os.command 时会出现错误“未指定收件人”(即使它本身在终端中运行完美)并且使用 subprocess 它不会 运行 任何东西

最佳实践:将 Shell 完全替换为 Python

最好的 方法是根本不使用 shell。

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

用管道做这个比较复杂;请参阅 https://docs.python.org/3/library/subprocess.html#replacing-shell-pipeline,以及此站点上已有的许多重复项。


第二个选择:使用sh-compatible语法

echo 没有被 POSIX sh 标准定义(standard document itself 建议不要使用它,也完全不允许 -e),所以可靠的东西要做的是使用 printf 代替。

将要发送的文本作为文字 command-line 参数 (</code>) 传递,使我们摆脱了为 shell 弄清楚如何转义它的工作。 (前面的<code>'_'是填[=17=])。

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

string_to_send = '''From: abc@gmail.com
To: abc1@gmail.com
Subject: package for ryan

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