【问题标题】:How to run/interact with a Golang executable in Python?如何在 Python 中运行 Golang 可执行文件/与之交互?
【发布时间】:2016-10-19 03:32:15
【问题描述】:

我在 Windows 上有一个名为 cnki-downloader.exe 的命令行 Golang 可执行文件(此处开源:https://github.com/amyhaber/cnki-downloader)。我想在 Python 中运行这个可执行文件,并与之交互(获取它的输出,然后输入一些内容,然后获取输出,等等)

这是一个命令行程序,所以我认为它与MSVC构建的普通Windows命令行程序相同。我的代码是这样的:

# coding=gbk

from subprocess import Popen, PIPE

p = Popen(["cnki-downloader.exe"], stdin=PIPE, stdout=PIPE)
#p = Popen(["WlanHelper.exe"], stdin=PIPE, stdout=PIPE )

p.stdin.write( 'XXXXXX\n' )
result1 = p.stdout.read() # <---- we never return here
print result1

p.stdin.write( '1\n' )
result2 = p.stdout.read()
print result2

我的 Python 代码在带有 cnki-downloader.exe 参数的 Popen 调用处停止。然后我尝试了一个MSVC构建的C命令行程序(命名为WlanHelper.exe),运行良好。我的脚本可以从 exe 中获取输出。

所以我怀疑 Golang 可执行文件的命令行机制与原生 C/C++ 程序不同,其他语言(如 Python)很难调用和交互。

所以我想知道如何在 Windows 上使用 Python 等其他语言与 Golang 可执行文件进行交互?。如果这不可能,我也可以考虑修改 Golang 程序的源代码(因为它是开源的)。但我希望我不会走那一步。谢谢!


注意:

如果可能的话,我想直接调用这个 Golang 可执行文件,而不是将其修改为库并让 Python 导入它。如果我必须将 Golang 修改为库,为什么不直接删除交互方式,将所有内容都变成命令行参数?无需费心编写 Golang 库。所以请让我们假设 Golang 程序是闭源的。我认为 Python 没有办法调用命令行 Golang 程序。如果是这样的话,那么我认为 Golang REALLY 在与其他语言的互操作性上需要改进。

【问题讨论】:

  • @captncraig 我认为该解决方案需要将 Golang 编译为库而不是当前的可执行文件。有没有办法不更改 Golang 可执行文件的源代码?
  • 啊,也许您的目标应用程序正在运行这一事实与您的问题无关。似乎与 python 的子进程交互存在一些问题。

标签: python windows go command-line


【解决方案1】:

查看您正在使用的子进程模块的documentation,似乎他们有使用stdout.read() 和朋友的死锁警告:

警告这将在使用 stdout=PIPE 和/或 stderr=PIPE 时发生死锁 并且子进程向管道生成足够的输出,使其 等待 OS 管道缓冲区接受更多数据的块。采用 communicate() 来避免这种情况。

那么,也许尝试改用communicate

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 2016-08-24
    相关资源
    最近更新 更多