【问题标题】:python: subprocess arguments splitting strings wrong [duplicate]python:子进程参数拆分字符串错误[重复]
【发布时间】:2015-06-02 18:37:00
【问题描述】:

我尝试通过 python 自动获取 pacman 的一些依赖项。 我想在 shell 中发出(并从中获取输出)是:

pacman -Si [a_package] | grep Conflicts | awk -F: '{print $2}'

这是我的python代码:

getconflicts1 = "pacman -Si"
getconflicts2 = "| grep Conflicts | awk -F: '{print $2}'"
pkgs = # an example package list
for x in range (1,2):
    getconflicts = getconflicts1 + pkgs[x] + getconflicts2
    process2 = subprocess.Popen(getconflicts.split(), stdout=subprocess.PIPE)
    conflicts = process2.communicate()[0]
    print(conflicts)

但是,当我使用 python 程序时,pacman 说“无效选项 -- F”,而在 shell 中直接发出命令。

这个:

print(getconflicts.split())

给我:

['pacman', '-Si', 'frameworkintegration', '|', 'grep', 'Conflicts', '|', 'awk', '-F:', "'{print", "$2}'"]

我对 python 和 python 中的子进程有点陌生,所以你有关于如何正确地做到这一点的提示吗?

【问题讨论】:

  • 不要将解决方案放入问题中,而是将其作为答案发布。
  • 问题已经得到解答,但我在问题中添加了解决方案,因为根据我的经验,将它放在帖子中也非常有用。
  • 它不会阻止您遵循 StackOverflow 格式:问题是针对问题的。答案是为了答案。你不需要接受你自己的答案,但你应该把你的解决方案作为答案,而不是更新你的问题。 stackoverflow.com/help/self-answer
  • 我不想重新发布给定的解决方案。我只是认为当答案是嵌入的时候,它的可读性会更好。

标签: python string subprocess


【解决方案1】:

我想我以前遇到过这种情况,除非你使用 shell=True 否则你不能在那里使用管道。我认为原因是 subprocess 没有使用 shell 来启动你的命令,除非你告诉它,所以 |只是作为另一个参数传递给您正在调用的可执行文件。

【讨论】:

  • 这至少消除了初始错误,但现在 pacman 说:“错误:没有指定操作...”虽然操作“-Si”包含在“getconflicts.split()”中
  • 你实际做了什么改变来获得它?如果你改为使用shell=True,你就不需要再分割了,它把命令作为一个字符串交给shell处理。
  • 哦,哇,太酷了!谢谢!
猜你喜欢
  • 2013-04-18
  • 2015-05-12
  • 2018-07-27
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多