【问题标题】:python 2.7 and subprocess() not passing args correctlypython 2.7 和 subprocess() 没有正确传递参数
【发布时间】:2016-08-19 19:37:10
【问题描述】:

这适用于 /bin/bash 命令行……

$ /usr/bin/kafka-console-producer --topic AsIs-CalculatedMeasure --broker-list wrlmr4:9092 < /tmp/dataFile

'['0 -eq 0']'

当我调用 python 的子进程时,它会阻塞我的参数,我更改了 arg 顺序,它总是会导致第一个“-arg”阻塞

kafkaProducer='/usr/bin/kafka-console-producer'
cmdLineArgs = []
cmdLineArgs.append(kafkaProducer)
cmdLineArgs.append("""--broker-list wrlmr4:9092""")
cmdLineArgs.append("""--topic %s""" % ('AsIs-CalculatedMeasure'))
print 'Calling subprocess(%s)'%(cmdLineArgs)
cmd = subprocess.Popen(cmdLineArgs, stdin=subprocess.PIPE)
# now write the input file to stdin ...
cmd.stdin.write(payload)


Calling subprocess(['/usr/bin/kafka-console-producer', '--broker-list wrlmr4:9092', '--topic AsIs-CalculatedMeasure'])

Stderr:代理列表 wrlmr4:9092 不是一个公认的选项

subprocess 似乎正在吃“--broker-list”中的“--”。我已经切换了 arg 顺序,它给出了同样的错误“--”被吃掉了,我也尝试过“--”到 no有用。

【问题讨论】:

  • 使用shlex.split() 分割和引用命令行参数,不要手动操作。如果不仔细查看您的代码,我敢打赌这就是您的问题所在。
  • --broker-list--topic 选项可能在逻辑上连接到它们的值,但选项和值仍然应该是单独的命令行参数。

标签: python bash python-2.7 subprocess


【解决方案1】:

要么你传递一个带有所有参数的大字符串,用引号保护空格,像这样:

subprocess.Popen('/usr/bin/kafka-console-producer --broker-list wrlmr4:9092 --topic AsIs-CalculatedMeasure', stdin=subprocess.PIPE)

或者你正确地拆分了命令行。 您将两个参数作为一个传递,子进程在它们周围添加了引号以保护它们,并且您的调用程序无法解析参数。

当执行它的 getopt 或其他什么时,你调用的程序预期:

--broker-list 作为参数 n wrlmr4:9092 作为参数 n+1

但是子进程保护了参数,因为它有空间所以你的调用程序收到了

--broker-list wrlmr4:9092 作为参数 n

它根本不喜欢它:)

像这样修复你的 cmdLineArgs 准备

cmdLineArgs.extend(["--broker-list","wrlmr4:9092"])
cmdLineArgs.extend(["--topic","AsIs-CalculatedMeasure"])

我通常推荐第二种方法,主要是如果参数来自调用者,并且可能包含空格。 subprocesses.Popen 会为您报价。

【讨论】:

  • 嘿 Jean-Francois .... 谢谢,我应该尝试一下,但没有...非常感谢!
  • 我的荣幸:我已经习惯了这个问题:stackoverflow.com/questions/39044114/…(今天回答)。似乎所有语言都会出现问题。
  • 我只是和同事聊天......因为被调用的程序可能正在使用 getopt() 来处理 args。它需要将 argv 设置为单独的参数,而不是我将它们“捆绑”在一起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多