【发布时间】:2018-02-08 02:55:42
【问题描述】:
我正在尝试通过 Popen 从主 Python 程序运行特定于供应商的旧版 Python (SunGard Arena Python) 并与之交互,因为我需要通过供应商版本的 Python 访问数据库。
虽然我得到了,但我可以通过 shell 运行供应商 Python
'import site' failed; use -v for traceback.
现在当我尝试通过 Popen 运行它时,如果我执行标准:
proc = Popen('U:arena_python.exe',bufsize=-1,stdin=PIPE, stdout=PIPE, stderr=STDOUT)
它根本不起作用,当我执行 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\SysWOW64\ntdll.dll 中存在访问冲突。奇怪的是,如果我运行上述程序并包含一个脚本作为命令行参数,则该脚本在进程再次崩溃之前运行良好。玩玩,如果我用 close_fds=True 运行它似乎效果更好:
Popen('U:arena_python.exe',bufsize=-1,close_fds=True)
但是我不知道如何与进程交互 - 文档说在 Windows 上你不能使用 close_fds=True 和重定向输入/输出。
知道发生了什么吗?我如何与流程互动?谢谢,
【问题讨论】:
-
您调用的 sunguard python 似乎存在严重漏洞,最好由其支持团队修复。如果您真的想尝试,可以使用
STARTUPINFO,将显式文件句柄传递给底层CreateProcess。如果我理解正确的话,即使使用close_fds=True,这些也应该有效。 -
感谢@spectras。在进一步调查中,看起来真正使进程崩溃的是标准输入——如果我不使用任何标准输入,它可以工作,但它违背了我的目的。我想知道我是否可以让子进程从其他方式监听输入命令?
-
如果你在两边都写代码,如果你不需要实时控制,你可以把命令放到一个临时文件中,或者你可以使用一个套接字。或者可能是命名管道。这些都会让人觉得有点骇人听闻,但起点是克服一个有问题的程序,所以……
标签: python subprocess