【问题标题】:Python Popen on Windows, close_fds and redirecting input / outputWindows 上的 Python Popen、close_fds 和重定向输入/输出
【发布时间】: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


【解决方案1】:

我知道这是一篇旧帖子,但为了记录,这是我的解决方案:

我也有这个问题。我找到了一个棘手的解决方法,发表在以下问答中: Howto: workaround of close_fds=True and redirect stdout/stderr on windows

祝你有美好的一天。

【讨论】:

  • 感谢您的回答!我们已经停用了我们的 SunGuard 软件,因此无法检查它是否正常工作!
猜你喜欢
  • 1970-01-01
  • 2020-02-06
  • 2018-12-13
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
  • 2017-06-14
  • 2012-07-11
相关资源
最近更新 更多