【问题标题】:os.system unable to call file with left parenthesis '(' in filenameos.system 无法调用文件名中带有左括号“(”的文件
【发布时间】:2017-12-17 07:42:44
【问题描述】:

我正在尝试调用名称中带有括号的可执行文件(例如'test(1).exe')。

使用 Python 3.6.2,当我尝试以下操作时:

os.system('test(1).exe')

我明白了:

'test' is not recognized as an internal or external command, operable program or batch file.

但如果我通过删除'(' 将文件名更改为'test1).exe',则以下操作成功:

os.system('test1).exe')

知道为什么左括号会导致os.system 出现问题吗?

【问题讨论】:

  • 试试这个test\ \(1\).exe' inside os.system()`
  • 如果你要使用os.system(),你需要转义shell特殊字符/分隔符。或者,从同一函数的文档中:'subprocess 模块提供了更强大的工具来生成新进程并检索它们的结果; 使用该模块优于使用此功能。请参阅子流程文档中的 Replacing Older Functions with the subprocess Module 部分,了解一些有用的秘诀。'
  • 如果您使用的是 Windows(如图所示),那么您需要“转义”某些字符。这是我在 Windows 命令行参考帮助文件中的说明:“与号 (&)、管道 (|) 和括号 (()) 是 当您将它们作为参数传递时,必须以转义字符 (^) 或引号开头。" (强调我的)
  • SS64 command-line reference 网站上标题为Syntax : Escape Characters, Delimiters and Quotes 的部分中找到了一些关于它的在线文档

标签: python windows os.system


【解决方案1】:

使用 subprocess.call() 而不使用 shell=True 可以避免以 shell 安全的方式引用参数:

subprocess.call(["test(1).exe"])

【讨论】:

  • 您可以省略“.exe”以帮助处理跨平台代码。如果由于某种原因需要shell=True,则需要用双引号将可执行文件名称括起来,并将命令行作为字符串而不是列表传递,例如subprocess.call('"test(1)"', shell=True).
【解决方案2】:

解决方法:在 '(' 前面放一个 '^' 字符,如下所示:

os.system('test^(1).exe')

【讨论】:

  • @martineau:从 OP 在 Windows 上运行的错误消息来看,^ 是 cmd.exe 中的转义字符,很像 \。
  • 不做任何解释,这只是巫术。
  • mendlo:如果您将这些信息放入您的答案中,我可能不会拒绝您的答案。
  • 可能会明确指出这是一个仅限 Windows 的答案——在 Linux 上遇到同样问题的人可能会失望地发现它不起作用。
猜你喜欢
  • 2016-08-15
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
  • 2015-06-29
  • 2012-12-26
  • 2013-08-12
相关资源
最近更新 更多