【问题标题】:How to get Python GUI to call a genetic algorithm written in C如何让 Python GUI 调用用 C 编写的遗传算法
【发布时间】:2013-11-24 04:15:58
【问题描述】:

我是 Stack Overflow 的新手。我有一个用 C 语言编写的遗传算法,它以数字 0-100 的形式接受用户输入,并输出一个数字数组。 C 代码是一个完整的、独立的编译程序。它有一个命令行界面。我对编程比较陌生,主要是在找到特定任务的解决方案之前进行黑客攻击。我在阅读 Python Subprocess 管理文档时非常困惑。我有一个使用 tkinter 用 Python 编写的 GUI,我有一个框,用户可以在其中输入他们的响应值 (0-100)。我的代码中还有一个空数组,我想用遗传算法的输出填充它。用户将使用该数组做某事,给出另一个响应 (0-100),C 代码将接受该响应,生成另一个数字数组,然后该过程继续。我的问题是,谁能简单地向这个新手解释一下如何使用 subprocess 模块将我的 python GUI 和 C 代码遗传算法链接在一起来达到这个目的?谢谢!

【问题讨论】:

  • 这是一个与子进程交互的示例:quickdraw.py -- 它包装了java 子进程以提供 Python API。

标签: python c user-interface subprocess


【解决方案1】:

我假设您能够将用户输入的文本存储在变量中?如果没有,this question 很好地解释了它。无论如何,一旦你得到它,像这样调用 subprocess.check_output:

 result = subprocess.check_output(["./cexecutable", inputValue])

(将“cexecutable”替换为您的遗传算法程序的可执行文件的名称,并将 inputValue 替换为您存储输入的任何变量)

这应该将遗传算法的输出存储在结果中。这将是一个字符串,因此如果有多行输出,您可能需要调用result.split("/n") 来获取行列表。然后,您可以根据它们的格式来解析它们并将它们放入您认为合适的数组中。

假设您有某种与文本框相关联的“输入”按钮,并且您将这一切作为单击按钮时发生的事件来执行,每次用户输入新文本并单击时都会发生这种情况按钮。

编辑(回应评论): 要使程序在后台运行,您需要使用subprocess.PopenPopen.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: 事实证明这实际上不是一个可行的解决方案 - 请参阅下面 J.F. Sebastian 的 cmets。

【讨论】:

  • 感谢您的详尽解释,非常感谢!我能够将用户输入的文本保存为变量,因此您描述它的方式听起来并不像文档在我看来那样可怕。我认为遗传算法一旦打开,就应该保持打开并在后台运行。它的工作是从用户那里获得关于其输出效用的反馈。算法和用户一起工作以找到一个特定的序列,它不仅仅是一个带有输入和输出的计算器。你的方法可以让 C 代码在后台运行吗?
  • 哦,我明白了,这会更复杂,但应该仍然可行。如果您在 python 之外运行遗传算法,它如何期望收到反馈?你只是在命令行上输入(即输入到标准输入流)吗?
  • 是的,它是一个命令行界面。该算法有一些魔力,产生一个数字数组,用户将该数组用于某些事情(在这个问题的范围内并不重要)给出一些关于这些数字在命令行上的效用的反馈(0-100),然后该算法使用该反馈来调整它正在探索的空间,并输出另一个数字数组。因此,在找到一个好的数字数组之前,可能需要算法和用户进行 10,000 次试验。我刚刚编写了 GUI,以使其对用户来说不那么可怕。我希望我描述得足够详细,谢谢!
  • 我还可以调整 C 代码输出以写入 .csv 文件或其他内容,并让 python 代码读取文件。不过,这不会解决将用户输入输入 C 程序的问题。我不确定最好的攻击计划是什么,我只是希望有一种方法可以将 C 程序与 python GUI 包装器一起使用。
  • .csv 的想法很有创意,但不是必须的。我用更精简的解决方案编辑了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 2011-12-23
相关资源
最近更新 更多