【问题标题】:shows error " sh: 1: Syntax error: Unterminated quoted string " in python在python中显示错误“ sh:1:语法错误:未终止的带引号的字符串”
【发布时间】:2020-06-06 01:25:26
【问题描述】:
#!/usr/bin/env python3
from os import system

def playSong():
    message = "it's time to drink water and, take a rest for some minutes."
    #filepath = "/home/leader/Downloads/anywhere.mp3"
    system("espeak '" + message + "'")

playSong()

在终端中运行此程序时,它会显示此错误。我怎样才能摆脱这个?

【问题讨论】:

  • 您将单引号字符串传递给espeak,但您的单引号字符串在第一个单词中包含撇号,这会关闭单引号。可能有一种方法可以逃避它或使用不同的引号,但我不熟悉 espeak 所以我不知道如何避免这个问题,除非你的字符串中没有撇号。
  • 你想让消息被'而不是"引用吗?
  • 其实引用不是问题。使用 ' 或 '' 都可以,但仍然无法正常工作。
  • 完全不要使用system()——这非常危险。
  • 顺便说一句,哪个版本的 Python?如果它是一个足够新的版本,有subprocess.run(),那比直接调用Popen() 更容易使用。

标签: python espeak


【解决方案1】:

永远不要使用system()——在任何语言中,而不仅仅是 Python——如果没有明确编写和审核为有效、安全的 shell 脚本并且不能有不受控制的内容替换的字符串。

当您需要传递参数时,请改用subprocess 模块:

#!/usr/bin/env python3
import subprocess

def playSong():
    message = "it's time to drink water and, take a rest for some minutes."
    #filepath = "/home/leader/Downloads/anywhere.mp3"
    p = subprocess.Popen(['espeak', message])
    p.wait()

playSong()

否则,当有人试图播放消息Do not ever run $(rm -rf ~)(或更故意的恶意变体$(rm -rf ~)'$(rm -rf ~)')时,您将度过一个非常糟糕的一天。

【讨论】:

    【解决方案2】:

    试试这个,用 \ 转义单引号

    message = "it\\'s time to drink water and, take a rest for some minutes."
    
    system('espeak "%s"' %message)
    

    【讨论】:

    • 好的,必须使用 2 \\.请测试一下,它在我的小实验室工作,并使用编辑的方式启动系统
    • 它起作用了,但只是部分起作用。只有“它的”被执行了。必须在两边加上 " 引号并避开它。message = "\"是时候喝水了,休息几分钟。\""
    • 按照您的建议检查新更新。我在之前的测试中使用文件 0'0.txt 和简单的 cat 进行了测试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多