我在 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/