2016-02-16 35 views
1

我想通過Popen從主Python程序運行並與供應商特定的舊版本的Python(SunGard Arena Python)進行交互,因爲我需要通過Popen訪問數據庫Python的供應商版本。Python Popen在Windows上,close_fds和重定向輸入/輸出

proc = Popen('U:arena_python.exe',bufsize=-1,stdin=PIPE, stdout=PIPE, stderr=STDOUT) 

它並不:

我可以通過外殼雖然我得到

'import site' failed; use -v for traceback. 

現在,當我試圖通過POPEN運行它,如果我做的標準運行Python的供應商工作在所有和當我做proc.communicate()我得到:

('An exception has occurred -- see the traceback log in "acm_.log".\nCreated a minidump in ".\\arena_python-20160216-092027-942.dmp".\n\'import site\' failed; use -v for traceback\n', None) 

該日誌提到在C:\ WINDOWS \ SysWOW訪問衝突64 \ NTDLL.DLL。奇怪的是,如果我運行上面的內容並將腳本作爲命令行參數包含在內,腳本將在該進程再次崩潰之前正常運行。玩耍,似乎更好地工作,如果我與close_fds運行= TRUE:

Popen('U:arena_python.exe',bufsize=-1,close_fds=True) 

但是當時我不知道如何與過程互動 - 文件說,在Windows上無法使用close_fds = True並重定向輸入/輸出。

任何想法是怎麼回事?我如何與流程互動?謝謝你,

+0

看起來你正在調用的sunguard python被嚴重竊聽,並且可能會被其支持團隊更好地修復。如果你真的想嘗試,你可以使用['STARTUPINFO'](https://docs.python.org/2/library/subprocess.html#subprocess.STARTUPINFO),將顯式文件句柄傳遞給底層的'CreateProcess '。如果我理解正確,那麼即使使用'close_fds = True'也應該可以工作。 – spectras

+0

謝謝@spectras。在進一步的調查中,看起來真正崩潰的過程是標準輸入 - 如果我不使用任何標準輸入,它會起作用,但它會破壞我的目的。我想知道是否可以讓子進程從另一種方式監聽輸入命令? – alex314159

+0

如果您在雙方編寫代碼,如果您不需要實時控制,或者可以使用套接字,則可以將這些命令放在臨時文件中。或者一個命名管道也許。這些都會覺得有點駭人聽聞,但起點是克服一個錯誤的程序,所以... – spectras

回答