python - 如何在 Python 中运行/与 Golang 可执行文件交互?

标签 python windows go command-line

我在 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)很难调用和交互。

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


注意:

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

最佳答案

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

Warning This will deadlock when using stdout=PIPE and/or stderr=PIPE and the child process generates enough output to a pipe such that it blocks waiting for the OS pipe buffer to accept more data. Use communicate() to avoid that.

所以,也许尝试使用 communicate相反?

关于python - 如何在 Python 中运行/与 Golang 可执行文件交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40121657/

相关文章:

google-app-engine - 安装appengine sdk后Golang未定义google.JWTAccessTokenSourceFromJSON

python - 如何在 pexpect 的日志文件中获取时间戳

python - 在 Vagrantfile 中安装 PyEnv

windows - 我在哪里可以下载 Windres(Binutils 的一部分)的 Windows 二进制文件?

c++ - 将 Windows 可执行文件用作 DLL 时如何初始化 C 运行时

戈朗 : can't decompress data with lzw package

go - 从Go lang的dynamodb表中获取所有唯一值

python - Pycharm 中没有模块 pygame

python - 关键字 arg 之后的 Django SSLRedirect 非关键字 arg

windows - Azure 网站授予访问权限