python 2.7和subprocess()没有正确传递args

时间:2016-08-19 19:37:10

标签: python bash python-2.7 subprocess

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

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

&#39; [&#39; 0 -eq 0&#39;]&#39;

当我调用python的子进程时,它会扼杀我的参数,我已经改变了arg顺序,它总是会导致第一个&#34; -arg&#34;

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:broker-list wrlmr4:9092不是公认的选项

subprocess似乎正在吃&#34; - &#34;来自&#34; - 经纪人列表&#34; ..我已经切换了arg命令并且它给出了相同的错误&#34; - &#34;吃了,我也试过了#34; - &#34;无济于事。

1 个答案:

答案 0 :(得分:2)

你要传递一个包含所有参数的大字符串,用引号保护空格,如下所示:

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会为您报价。