2013-01-02 58 views
2

我有兩個簡單的腳本 - 我試圖將一些信息(日期作爲輸入到python腳本)傳遞給bash腳本。這裏的蟒蛇之一:當調用窗體python腳本bash腳本不讀取行

#!/usr/local/bin/python 

import os 
import sys 
import subprocess 

year = "2012" 
month = "5" 
month_name = "may" 

file = open('date.tmp','w') 
file.write(year + "\n") 
file.write(month + "\n") 
file.write(month_name + "\n") 
file.close 

subprocess.call("/home/lukasz/bashdate.sh") 

而這裏的慶典之一:

#!/bin/bash 

cat /home/lukasz/date.tmp | \ 
while read CMD; do 
    echo -e $CMD 
done 
rm /home/lukasz/date.tmp 

Python腳本工作正常,沒有問題。它調用bash腳本,但它看起來像while循環不運行。我知道bash腳本確實運行,因爲rm命令被執行並且date.tmp文件被刪除。但是,如果我註釋掉python中的子進程調用,然後手動運行bash腳本,它可以很好地顯示每一行。

簡要說明我正在努力完成什麼。我有一個python腳本,可以將一個非常大的數據庫導出爲CSV(近300個表格和幾個數據集),然後調用bash腳本將CSV壓縮爲一個文件並將其移動到另一個位置。我需要將提供給python腳本的月份和年份傳遞給bash腳本。

+0

順便說一句,那三個變量都是你需要傳遞給你的實際腳本的嗎?如果是這樣,我建議將它們作爲命令行參數傳遞,而不是使用臨時文件。像Python中使用'subprocess.call([「/ home/lukasz/bashdate.sh」,year,month,month_name])'',然後'year = $ 1;月= $ 2; month_name = $ 3'在Bash中。要檢查傳遞給Bash腳本的參數個數,可以使用'if [$#-lt 3];然後回聲「請更多論據。」;出口1; fi '(或者如果您只需要三個參數,請將'-lt'更改爲'-eq')。 – Blair

+0

爲什麼你需要一個bash腳本來將CSV壓縮成一個文件並將其移動到另一個位置?你不知道標準庫中的'shutil'和/或'zipfile'和'os'嗎? – abarnert

+0

@abarnert直接來自python.org上的shutil頁面:警告即使更高級別的文件複製函數(shutil.copy(),shutil.copy2())也無法複製所有文件元數據。除此之外(這是一個問題),另一個問題是CSV位於/ tmp中(這是mysqld由於權限而可以輕鬆寫入文件的唯一位置)。最後,只需調用一個bash腳本的解決方案就簡單多了,而且它可以工作。考慮到這是每個月手動進行一次(它需要一些其他用戶輸入的文檔),它足夠滿足我的需求。 – Lukasz

回答

2

而不是寫一個臨時文件,將年,月和月份名稱的值作爲parameters發送到bash腳本。即,在Python代碼中刪除所有的行與他們file,並更換
subprocess.call("/home/lukasz/bashdate.sh")

subprocess.call(['/home/lukasz/bashdate.sh', year, month, month_name])

和在bash腳本,更換cat ... rm線與(例如)
y=$1; m=$2; mn=$3
,其將年份,月份和月份名稱放入shell變量y,m和mn中。

+0

如果你真的想要的話,你甚至可以重新使用bopt腳本來使用'getopt'。這不會太多工作。 – mgilson

+0

哦,我不知道可以做到。大概應該看看subprocess.call更多。謝謝! – Lukasz

5

我相信你需要file.close()而不是file.close。對於後者,由於不調用方法,因此實際上並沒有關閉文件。由於您尚未實際關閉文件,因此可能不會刷新文件,因此文件的全部內容可能會被緩衝而不是寫入磁盤。

作爲一個側面說明,如果你使用上下文管理這些東西是自動的照顧:

with open('foofile','w') as fout: 
    fout.write("this data") 
    fout.write("that data") 

#Sleep well tonight knowing that python guarantees your file is closed properly 
do_more_stuff(blah,foo,bar,baz,qux) 
+0

+1 - 毆打。在我的系統上進行測試,這使它工作。 – Blair

+0

這工作 - 我會標記爲一旦StackOverflow會讓我回答。 – Lukasz

-1

也許嘗試加入shell=True的號召:

subprocess.call("/home/lukasz/bashdate.sh", shell=True) 
+2

我真的不認爲這會在這種情況下產生任何影響(除了不必要地產生shell) – mgilson