【问题标题】:Unknown shorthand flag: 'E' in -E未知速记标志:-E 中的“E”
【发布时间】:2023-03-25 20:05:01
【问题描述】:

我正在尝试在python 中执行bash 命令

我要执行的bash命令是:kubectl get ns | grep -E '(^|\s)OK($|\s)'

在 python 中,我这样做:

is_namespace_exists = subprocess.call(["kubectl", "get", "ns", "|", "grep", "-E", "\'(^|\s)"+NAMESPACE+"($|\s)\'"])

is_namespace_exists = subprocess.call(["kubectl", "get", "ns", "|", "grep", "-E", "'(^|\s)"+NAMESPACE+"($|\s)'"])

但我收到此错误:

未知的速记标志:'E' in -E

谁能告诉我出了什么问题?

【问题讨论】:

  • 当我在普通终端中执行此操作时,它可以工作。当我使用 python 执行它时,它不会。
  • 我收回我之前的评论。它被解释为kubectl 的参数,因为|subprocess 没有任何意义。它只在 shell 中有意义。 subprocess 不通过 shell 解析命令。
  • 那么我能做些什么呢?我需要那个管道(|
  • 您需要在subprocess.call 调用中使用shell=True,并将其传递给字符串而不是列表。
  • 我可能更喜欢只执行['kubectl', 'get', 'ns'],然后在 Python 中进行一点点字符串处理。

标签: python


【解决方案1】:

以下代码应该可以工作:

import subprocess

NAMESPACE = "..."  # Define NAMESPACE variable here

proc1 = subprocess.Popen(['kubectl', 'get', 'ns'], stdout=subprocess.PIPE)
proc2 = subprocess.Popen(["grep", "-E", "\'(^|\s)"+NAMESPACE+"($|\s)\'"], stdin=proc1.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

proc1.stdout.close() # Allow proc1 to receive a SIGPIPE if proc2 exits.
out, err = proc2.communicate()
print('out: {0}'.format(out))
print('err: {0}'.format(err))

基本上是this post的改编版。根据您的需要进行调整。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 2022-08-09
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多