【问题标题】:print output of subprocess call into a label tkinter将子进程调用的输出打印到标签 tkinter
【发布时间】:2015-06-06 00:29:27
【问题描述】:

我正在尝试在 tkinter 中创建一个 GUI。 Gui 基本上适用于Mcp23017。我正在尝试配置输入和输出引脚,以便用户可以根据自己的选择更改它们。还有一个选项可以使输入/输出高或低..

现在我正在尝试使用“i2cget”(使用单独的函数)读取引脚。我需要将此子进程调用的输出显示到 gui 上的标签中。

这是我的代码的样子:

def read_p22():
   output = subprocess.call(['i2cget -y 0x20 0x12 0xFD'],shell=True)
   x=print (output)
   Label(tableframe,textvariable=x).grid(row=2,column=20)
   root.after(5000, read_p22)

当这个函数执行时(通过按下按钮),但是当我按下按钮时,它会在 python shell 上交替打印一个值'1'......我不知道如何将输出重定向到标签.. 有人可以有什么建议吗?

更新::在执行建议的命令时:

process = subprocess.Popen(['i2cget -y 0x20 0x12 0xFD'], stdout=PIPE,      stderr=PIPE, shell=True)
output, code = process.communicate()

我打印了“输出”和“过程”,他们分别给了我以下内容:

b'' <subprocess.Popen object at 0x00000000035CB2B0>

由于没有任何东西连接到该引脚,我希望它返回一个值“0”。我不知道它给我的 b'' 是什么......

任何建议都非常感谢..

亲切的问候, 纳米塔。

【问题讨论】:

  • 返回的 b'' 是 pythons 显示一个空字节字符串,因为它没有特定的编码
  • @James Kent:感谢您为我澄清这一点..:) 但它不应该给我一个“0”吗?还是只有在我实际连接某些东西时才会给出 0?而且这个(b'')仍然出现在shell而不是GUI中。有没有办法可以把它放在 GUI 上?
  • 如果您不知道b'' 是什么,那么您应该先学习一些Python,然后再尝试结合tkintersubprocess。如果您已经了解其他编程语言,那么read the official Python tutorial 否则start with Python for Non-Programmers

标签: python tkinter subprocess


【解决方案1】:

你得到的是返回码,而不是输出。

来自subprocess.call docs:

运行 args 描述的命令。等待命令完成,然后返回 returncode 属性

相反,使用subprocess.Popen 打开一个进程,subprocess.PIPE 将输出通过管道传输给您,并使用Popen.communicate 获取输出:

process = subprocess.Popen(['i2cget -y 0x20 0x12 0xFD'], stdout=PIPE, stderr=PIPE, shell=True)
output, code = process.communicate()
# do stuff with output...

【讨论】:

  • 感谢您的快速响应.. :) 我尝试了您所说的.. 它给了我一个错误说 output, code = process.communicate() NameError: name 'process' is not defined 。我做错了什么?
  • @NamitaRaju 如果它不起作用,请不要接受答案。我通过将Popen 对象重命名为process 来修复它。
  • 对不起,我不明白你重命名 Popen 对象的意思..
  • @NamitaRaju 我已经在答案本身中修复了它。 Popen 对象被命名为 output(第一行),并由 process(第二行)引用。
  • i2cget -y 0x20 0x12 0xFD 返回什么?更新您的问题以包含命令的输出以及您希望出现的内容。尝试打印 output 以查看其中包含的内容。
【解决方案2】:

您的代码中有多个错误。您应该将您的问题拆分为微小的子任务并独立完成每个任务。

1。在 Python 中将子进程的输出作为字符串变量获取

subprocess.call() 返回一个整数(退出状态),而不是字符串(输出)——启动 Python REPL 并尝试通过 subprocess 运行任何命令并亲自查看:它应该可以帮助您了解正在发生的事情除了阅读链接的文档。

如果你不介意阻塞你的 GUI 线程,你可以使用subprocess.check_output() 来获取输出——在子进程返回之前没有任何响应。

否则(如果i2cget 不会立即返回,总是),您可以do it asynchroniously using threads or .createfilehandler() method

2。了解为什么 x = print(output) 在 Python 中毫无用处

在 Python 2 中默认为 SyntaxError。否则,print() 函数 总是 返回 None,即,您可以编写 x = None(除了 output 作为副作用打印到标准输出)。

3。更新标签中的文本

【讨论】:

  • @JFSebastian :感谢您提供的所有提示.. 我是 python 的初学者,因此“不那么优雅”的代码.. 我会尝试使用您给我的建议.. _However 关于'subprocess.check_output',当我尝试使用它并在win7系统的python 3中运行它时,它给了我一个错误说@ 987654341@ ..我真的不明白为什么..你能提出一些建议吗?跨度>
  • @NamitaRaju:确保您可以运行从命令行传递给check_output() 的命令(如果您不知道“命令行”是什么——learn it first )。如果它在命令行中运行但因check_output() 而失败,则创建minimal but complete code examplepost it as a separate question
  • @J.Fsebastian:对不起,我忘了提到我也尝试从命令行运行它。但它给了我同样的错误。
  • @NamitaRaju:我的意思是,手动运行子进程(不使用 Python)——这样你就会知道正确的命令应该是什么样子。
猜你喜欢
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多