Re: [問題] subprocess問題

看板Python作者 (遥かなソラ)時間9年前 (2016/06/24 15:34), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
又搞了一個上午 好像找到問題在哪了 主要問題是python端不能讀到空的buffer, 一讀到空的buffer python就會一直等C的輸入 然後就等到死 換句話說 python需要知道現在buffer裡面有多少東西是我要讀出來的 直接call read()讀整份文件 沒有指定要讀幾個char或是讀幾行的話 就會把目前的東西都讀出來以後一直等C再input 所以這時候用工作管理員把C幹掉python就可以解除等待繼續運作 就可以看到資料print出來 整理一下 這個程式主要有兩個問題 1. C端沒有fflush,printf完buffer住沒有寫出去,python讀不到東西就一直等 2. python端沒有指定要讀多少資料,於是把目前資料讀出以後開始等C輸入 兩個問題都解決資料就能正常收送了 ※ 引述《lionel20002 (遥かなソラ)》之銘言: : 手邊有一個python的GUI,另外開了一個C的subprocess : 目前signal從python丟到C或是C丟到python都正常收到 : 但是資料的收送有些問題 : Python Code: : fpi_c = subprocess.Popen(["./FPI_sig"],stdin=subprocess.PIPE,stdout=subprocess.PIPE) : def handle_inform_from_c(signum, frame): : print("receved:", signum) : outstr = fpi_c.stdout.read() : print outstr : signal.signal(signal.SIGUSR1, handle_inform_from_c) : def gui_sense_and_save_fpi_2(): : fpi_c.stdin.write(str(123)+"\n") : os.kill(fpi_c.pid,signal.SIGUSR1) : gui_sense_and_save_fpi_2接一個按鈕 按下去會送資料跟SIGUSR1給C程式 : C code: : void signal_callback_handler2(int signum) : { : int gpid; : scanf("%d",&gpid); : printf("Caught signal %d\n",signum); : //fclose(stdout); : signal(SIGUSR1, signal_callback_handler2); : kill(getppid(),SIGUSR1); : } : int main() : { : signal(SIGUSR1, signal_callback_handler2); : while(1) : { : sleep(0.5); : } : return EXIT_SUCCESS; : } : 目前如果加上fclose(stdout),python端就可以收到C print出來的"Caught signal XXX" : 但是因為stdout close了 再傳資料就會顯示PIPE壞掉無法傳 : 沒有fclose(stdout)會當在python的outstr = fpi_c.stdout.read() : 感覺好像是python一直在等C執行結束才會收值 但是C只會一直等signal不會自己結束 : 所以就卡死? : 或者是subprocess.PIPE的管理根本就不對? : 昨天一整天都在找資料跟嘗試 還是無法搞定 : 怎樣才能讓資料正常收送 懇請高手幫忙m(_ _)m -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 203.160.153.142 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1466753688.A.1E4.html
文章代碼(AID): #1NREAO7a (Python)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1NREAO7a (Python)