我試圖使用subprocess.Popen(['cp'等..])在while循環中傳輸和重命名一些文件。並等待()。不幸的是,wait()命令似乎不能正常工作,即不等待文件完全複製到新目錄。大多數情況下,文件複製都很好,但是,隨機文件的一小部分不會(每次運行腳本都不是相同的文件),因此是零字節文件或不完整的文件。我也試過使用subprocess.check_call(),但這也不起作用。當我打印poll()值時,它始終爲零,這意味着該過程已完成。注意我正在處理的所有文件都在150KB範圍內。由於我使用的是iraf例程,我的python腳本正在使用python 2.7,python版本的iraf(圖像縮減和分析工具)運行在pyraf中。有沒有辦法強制Popen()或check_call()等待文件傳輸完成?如何強制wait()完全等待subprocess.Popen()完成
while count <= ncross_correlate and skip_flag != 's':
...more stuff
try:
iraf.rv.fxcor (object_fits, template_fits, apertures="*", cursor="",
continuum="both", filter="both", rebin="smallest", pixcorr="no",
osample=osample_reg, rsample=osample_reg, apodize=0.1, function="gaussian",
width="INDEF", height=0., peak="no", minwidth=3., maxwidth=21., weights=1.,
background=0., window=300., wincenter="INDEF", output=output_name, verbose="long",
imupdate="no", graphics="stdgraph", interactive="no", autowrite="yes",
autodraw="yes", ccftype="image", observatory="aao", continpars="", filtpars="",
keywpars="")
# Create a eps file of the cross_correlation file.
gki_output_name = output_name + '.gki'
iraf.plot.sgikern (gki_output_name, device='eps', generic='no', debug='no',
verbose='no', gkiunit='no')
不幸的是在fxcor創建.gki文件轉換爲一些可讀 格式伊拉克空軍以外的唯一方法是調用伊拉克空軍任務sgikern的轉儲一個.EPS文件在我 伊拉克空軍/伊拉克空軍/目錄,而不提供更改文件名或目錄放置的選項。事實上,文件名是隨機生成的。非常沮喪!另外請注意,使用iraf.plot.sgikern創建的任何eps文件都沒有問題(即,沒有開頭的0 KB文件)。複製和重命名是我遇到問題的地方。
# Find the eps file in /iraf/iraf/, rename it, and move to proper output location.
iraf_dir = '/iraf/iraf/'
eps_file_list = glob.glob(iraf_dir + 'sgi' + '*.eps')
...more code
在這一點上我一直在使用check_call()或POPEN()嘗試:
subprocess.check_call(['cp', eps_file_list[0], ccf_output_dir + object_name_sub +
'.eps'], stdout=subprocess.PIPE)
subprocess.check_call(['rm', eps_file_list[0]], stdout=subprocess.PIPE)
或
process1 = subprocess.Popen(['cp', eps_file_list[0], ccf_output_dir +
object_name_sub + '.eps'], stdout=subprocess.PIPE)
process1.wait()
process2 = subprocess.Popen(['rm', eps_file_list[0]], stdout=subprocess.PIPE)
process2.wait()
...more stuff
# end of try statement
#end of while statement
我想,如果我能以某種方式在合併的兩條POPEN聲明一個單獨的Popen語句,並且還包括一個可能爲0.01s的shell睡眠時間,以強制其他兩個進程在返回完成的進程之前完成,這可能會修復它。也許這樣的事情,雖然我不知道確切的sentax的:
process1 = subprocess.Popen(['cp', eps_file_list[0], ccf_output_dir +
object_name_sub + '.eps']; ['rm', eps_file_list[0]]; ['sleep', 0.01],
stdout=subprocess.PIPE)
process1.wait()
但願這給你什麼,我試圖做一個想法。我一直在嘗試很多不同的事情,並且全力尋找解決這個問題的辦法,而且我真的被困住了。
乾杯, 佈雷特
有函數叫''communic',會幫你 –
不相關,但'fxcor'函數簽名是荒謬的。 – Anorov
我看不出溝通會如何幫助我。你能舉個例子格里傑什嗎? Fxcor確實有很多輸入,因此調用序列很長。基本上fxcor代表傅里葉互相關。 –