我是新来的堆栈溢出。 我有C编写的遗传算法接受在多个0-100的形式的用户输入,并且输出数字的阵列。 C代码是一个完整的,独立的编译的程序。 它有一个命令行界面。 我是比较新的节目,主要是黑客攻击,直到我找到一个解决一个特定的任务。 和我在阅读Python的子流程管理文档很困惑。 我有使用Tkinter的Python编写的GUI,并且我有一个框,用户可以输入他们的响应值(0-100)。 我也有我的代码空数组,我想从遗传算法的输出来填充。 用户将使用该阵列的东西,给另一响应(0-100)的C代码将采取响应,产生数字的另一个阵列,并且该过程继续。 我的问题是,任何人都可以解释这个新手简单来说如何使用子模块,以我的Python GUI和C代码遗传算法连接在一起,以结束? 谢谢!
Answer 1:
我假设你能够存储用户在一个变量输入的文本? 如果不是, 这个问题说明了它非常漂亮。 无论如何,一旦你得到的,叫subprocess.check_output是这样的:
result = subprocess.check_output(["./cexecutable", inputValue])
(替换“cexecutable”与遗传算法程序和inputValue将与任何变量你存储在输入的可执行文件的名称)
这应该保存遗传算法结果的输出。 这将是所有一个字符串,因此,如果有输出的多行,你可能会想打电话result.split("/n")
获得行的列表。 然后,您可以分析它们,并把它们放入数组,你认为合适的基础上,他们是如何进行格式化。
假设你有某种与文本框相关的“输入”按钮,你正在做的这一切都为发生时,单击按钮时,会出现这种情况每次用户输入新的文本并按下按钮时的事件。
编辑 (在响应评论):要继续在后台运行的程序,你需要使用subprocess.Popen
和Popen.communicate
。 而不是仅仅返回你的程序的输出,这将创建一个POPEN对象,您可以继续与互动。 如果没有这个测试对你的代码,我不能保证下面的代码会做你想要什么,但我认为它应该是接近:
genAlg = subprocess.Popen(["./executable"])
...
#user enters data
...
result = genAlg.communicate(inputValue)[0]
#communicate sends the given argument to stdin, and returns a
#tuple (stdout, stderr) - you want stdout, hence the "[0]"
编辑2:原来,也不是一个可行的解决方案-见下文JF Sebastian的意见。
文章来源: How to get Python GUI to call a genetic algorithm written in C