python 2.7 和 subprocess() 没有正确传递参数
python 2.7 and subprocess() not passing args correctly
这适用于 /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不是公认的选项
子进程似乎正在吃掉“--broker-list”中的“--”。我已经切换了 arg 顺序,它给出了同样的错误“--”被吃掉,我也试过“--”无济于事。
要么传递一个包含所有参数的大字符串,用引号保护 spaces,如下所示:
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
但是 subprocess 保护了参数,因为它有 space 所以你调用的程序收到了
--broker-list wrlmr4:9092
作为参数 n
而且一点都不喜欢:)
像这样修复您的 cmdLineArgs 准备工作
cmdLineArgs.extend(["--broker-list","wrlmr4:9092"])
cmdLineArgs.extend(["--topic","AsIs-CalculatedMeasure"])
我通常推荐第二种方法,主要是如果参数来自调用者,并且可能包含 spaces。 subprocesses.Popen
将为您报价。
这适用于 /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不是公认的选项
子进程似乎正在吃掉“--broker-list”中的“--”。我已经切换了 arg 顺序,它给出了同样的错误“--”被吃掉,我也试过“--”无济于事。
要么传递一个包含所有参数的大字符串,用引号保护 spaces,如下所示:
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
但是 subprocess 保护了参数,因为它有 space 所以你调用的程序收到了
--broker-list wrlmr4:9092
作为参数 n
而且一点都不喜欢:)
像这样修复您的 cmdLineArgs 准备工作
cmdLineArgs.extend(["--broker-list","wrlmr4:9092"])
cmdLineArgs.extend(["--topic","AsIs-CalculatedMeasure"])
我通常推荐第二种方法,主要是如果参数来自调用者,并且可能包含 spaces。 subprocesses.Popen
将为您报价。