【问题标题】:Python - Executing shell command does not work on LinuxPython - 执行 shell 命令在 Linux 上不起作用
【发布时间】:2014-12-08 12:08:59
【问题描述】:

我喜欢在我的 Linux Mint 系统上从 Python 运行 shell 命令。 具体来说,该命令运行所有 Bleachbit 清洁剂并完美运行 运行时很好。

然而,试图通过 subprocess.call 模块运行相同的命令 总是导致引发异常。

我只是不明白为什么它不应该工作。 该命令不需要 sudo 权限,因此不需要 没有被赋予的权利。

在执行 python 命令时,我还关闭了 firefox/浏览器。

任何人,任何建议如何解决这个问题?

我的代码:

try:
    subprocess.call('bleachbit -c firefox.*') 
except:
    print "Error."

【问题讨论】:

  • 您的系统上没有名为 firefox.* 的文件。手动运行时,您的 shell 会处理通配符扩展,但 subprocess.call 默认情况下不使用 shell,而是使用一组字符串而不是一个以空格分隔的字符串。
  • subprocess.call 接受一个根据the docs数组,并且可以有一个shell=True 参数。 (不是 Python 专家,所以评论,不回答)
  • 不要使用裸露的expect:,它可能会捕获太多,例如KeyboardInterrupt

标签: python linux shell subprocess


【解决方案1】:

当 shell 为 False 时,你需要传递一个 args 列表:

import subprocess
try:
    subprocess.call(["bleachbit", "-c","firefox.*"])
except:
    print ("Error.")

【讨论】:

  • 你也可以传递一个字符串。如果你有 shell=true,你必须传递一个字符串。
  • @PaulBecotte, shell=True 通常最好避免
  • "*" 通配符由外壳扩展,即在您的示例中未扩展。
  • 两个答案都有效。然而,我认为塞巴斯蒂安的答案是最优雅的(从我初学者的角度来看),不需要将字符串分成几块,这对于长命令来说可能会变得讨厌,帕德莱克。为什么要避免 shell = True?
  • @JohnSlathon,看看这个页面中的警告docs.python.org/2/library/…
【解决方案2】:

subprocess module 默认情况下不会运行 shell,因此不会扩展诸如 * 之类的 shell 通配符(通配符模式)。您可以使用glob 手动展开它:

#!/usr/bin/env python
import glob
import subprocess

pattern  = 'firefox.*'
files = glob.glob(pattern) or [pattern]
subprocess.check_call(["bleachbit", "-c"] + files)

如果命令更复杂并且您可以完全控制其内容,那么您可以使用shell=True 在 shell 中运行它:

subprocess.check_call("bleachbit -c firefox.*", shell=True)

【讨论】:

  • 设置,shell=True 对我有用。虽然第一个解决方案给出了错误消息。很高兴知道使用子流程的复杂性。我自己应该能够通过文档找到它,但预计会出现更复杂的问题。
  • 检查 glob 调用返回的列表。是空的吗?我已经更新了答案,如果没有相应的文件,则按原样传递通配符
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多