2011-10-11 27 views
2

我正在使用python腳本將數據加載到數據庫批量加載程序。使用Python列表作爲輸入,用於使用stdin作爲輸入的linux命令

加載器的輸入是stdin。我一直無法獲得正確的語法來調用基於unix的批量加載器來傳遞要加載的python列表的內容。

我一直在閱讀關於Popen和PIPE,但他們沒有像我期望的那樣行事。

python list包含要被批量加載的數據庫記錄。在Linux中它看起來類似於這樣的:

echo "this is the string being written to the DB" | sql -c "COPY table FROM stdin" 

什麼是正確的方法替換echo命令與Python命令使用此命令?

我沒有這個過程的示例代碼,因爲我一直在用一些非常簡單的語法試驗Popen和PIPE的特性,而沒有獲得所需的結果。

任何幫助將非常感激。

感謝

+1

您的意思是傳遞列表中的數據的字符串表示,對吧? (因爲你不能像stdin那樣通過一個流來傳遞一個Python列表 - 你只能傳遞字節,例如文本) –

+0

你能像在Linux中輸入一樣使用一個完整的工作命令嗎? – heltonbiker

+0

正確的大衛。我將閱讀列表中的字符串。 – Steven

回答

3

如果你的數據是短期和簡單的,你可以預格式化整個列表,並做簡單的與子像這樣:

import subprocess 
data = ["list", "of", "stuff"] 
proc = subprocess.Popen(["sql", "-c", "COPY table FROM stdin"], stdin=subprocess.PIPE) 
proc.communicate("\n".join(data)) 

如果數據太大,預格式化這樣,那麼你可以嘗試直接使用stdin管道,儘管如果你需要從stdout/stderr中讀取,那麼在使用管道時子進程模塊也很脆弱。

for line in data: 
    print >>proc.stdin, line 
+0

這樣做。謝謝你的幫助。看到你使用我的例子使得文檔有意義。不太清楚爲什麼我沒有得到它。 – Steven

相關問題