bash 命令在 python3 中不会 运行
bash command wont run in python3
我制作了一个 python3 脚本,我需要 运行 一个 bash 命令来让它工作。我已经尝试了 os.system
和 subprocess
但它们都不能完全工作 运行 整个命令,但是当我 运行 在终端中单独使用命令时它就可以完美运行。我做错了什么?
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)
我制作了一个 python3 脚本,我需要 运行 一个 bash 命令来让它工作。我已经尝试了 os.system
和 subprocess
但它们都不能完全工作 运行 整个命令,但是当我 运行 在终端中单独使用命令时它就可以完美运行。我做错了什么?
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)