2016-08-19 32 views
0

這個工作從/斌/ bash命令行...蟒蛇2.7和子()不及格ARGS正確

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

'[' 0 -eq 0 ']'

當我調用Python的子進程,它扼流圈我的論點,我已經改變了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']) 

標準錯誤的扼流圈:券商名單wrlmr4:9092是不是一個公認的選項

子流程似乎是從「--broker-list」中吃掉「 - 」。我切換了arg順序,它給出了同樣的錯誤「 - 」被吃掉了,我也嘗試過「 - 」到no無濟於事。

+0

使用['shlex.split()'](https://docs.python.org/2/library/shlex.html#shlex.split)來分割和引用命令行參數,不要這樣做手。不要仔細查看你的代碼,我敢打賭,這就是你的問題所在。 –

+0

'--broker-list'和'--topic'選項可能在邏輯上連接到它們的值,但該選項和值仍然應該是單獨的命令行參數。 – user2357112

回答

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會爲你做報價。

+0

嘿讓 - 弗朗索瓦....謝謝,我應該試過這個,但沒有....非常感謝! – Craig

+0

我的榮幸:我習慣了這個問題:http://stackoverflow.com/questions/39044114/java-runtime-exec-cmd-c-parsing-quoted-arguments/39044198#39044198(今天回答)。似乎所有語言都出現問題。 –

+0

我只是和同事聊天......因爲被調用的程序可能使用getopt()來處理參數。它需要將argv作爲單獨的論據,而不是將我們「捆綁」在一起。 – Craig