【发布时间】: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