2012-08-31 38 views
0

我有一個jar文件,我可以發送數據進行處理,數據是json格式。 data_path是具有數據的文件的路徑。下面的工作很棒..但是我擁有的數據不會是一個文件,而是一個變量。下面的命令不能用於變量,它會嘗試讀取作爲文件目錄路徑傳遞給文件的數據。它是不同的bash命令嗎?或者我可以用子進程模塊做些什麼?謝謝!Python - 將數據傳遞給jar文件作爲輸入流

import subprocess as sub 

cmd = "java -jar %s < %s" % (jar_path, data_path) 
# send data in a var 
# cmd = "java -jar %s < %s" % (jar_path, data) 
proc = sub.Popen(cmd, stdin=sub.PIPE, stdout=sub.PIPE, shell=True) 
(out, err) = proc.communicate() 

回答

1

你可以寫入到一個臨時文件並傳遞:當上下文結束

import tempfile 

with tempfile.NamedTemporaryFile() as f: 
    f.write(data) 
    f.flush() 
    cmd = "java -jar %s < %s" % (jar_path, f.name) 
    ... 

臨時文件會刪除自身。

@FedorGogolev已刪除答案去爲一個Popen stdin方法,這不適合您的特定需求。但是,這是一個很好的方法,使我的信用他,以爲我想補充的是什麼,他打算爲...

import tempfile 

with tempfile.TemporaryFile() as f: 
    f.write(data) 
    f.flush() 
    f.seek(0) 
    cmd = "java -jar %s" % jar_path 
    p = subprocess.Popen(cmd, shell=True, stdin=f, stdout=subprocess.PIPE) 
    ... 

如果您傳遞文件對象作爲stdin ARG你必須做出的工作版本一定要先把它找到0的位置。

+0

謝謝,我想避免寫入文件,以消除任何額外的處理時間。但是,如果我找不到辦法,我可能會使用這種方法。順便說一句我沒有意識到這個臨時文件函數,所以謝謝你... – t0x13

+0

我會認爲一次寫入文件所花費的時間是可以忽略的,因爲你已經開始對命令進行脫殼。 – jdi

+0

好吧,你可能是對的:) – t0x13

相關問題