python - 通过子进程通过 python 运行 TCL,但不给出任何输出

标签 python tkinter tcl eval subprocess

我正在尝试通过 python 子进程运行我的 tcl 脚本,如下所示:

import subprocess
>>> subprocess.Popen(["tclsh", "tcltest.tcl"])
<subprocess.Popen object at 0x0000000001DD4DD8>
>>> subprocess.Popen(["tclsh", "tcltest.tcl"], shell=True )
<subprocess.Popen object at 0x0000000002B34550>

我不知道它是否有效,因为我没有看到任何东西! 我的 tcl 脚本还包含我公司的一些软件包,当我使用 Tkinter、Tk 和 eval 时,这些软件包会导致错误,

import Tkinter
import socket

def TCLRun():
 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 s.connect(('127.0.0.1', 5006))
 root = Tkinter.Tk()
## root.tk.eval('package require Azimuth-Sdk')
 tcl_script ="""
##package require Company-Sdk
## set players [ace_azplayer_list_players]
set players 2
puts $players 
##  if { $players != "" } {         
##  foreach player $players {   
##      set cmd ace_azplayer_remove_player
##      if { [catch { [ $cmd $player ] } err] } {   
##          puts " $cmd $player - $err" 
##          sleep 1 
##          }           
##      } 
##  } """
 # call the Tkinter tcl interpreter
 root.tk.call('eval', tcl_script)
 root.mainloop()

给我这个错误

import TCLCall
>>> TCLCall.TCLRun()

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    TCLCall.TCLRun()
  File "C:\Users\XXX\Desktop\PKT\TCLCall.py", line 24, in TCLRun
    root.tk.call('eval', tcl_script)
TclError: can not find channel named "stdout"

这就是我切换到子进程的原因。至少它不会给我错误!

知道如何通过 python 运行带有内部所需包的 tcl 脚本吗?!

谢谢

最佳答案

使用 subprocess.Popen 获取输出,您可以尝试以下操作:

import subprocess

p = subprocess.Popen(
    "tclsh tcltest.tcl",
    shell=True,
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE)
stdout, stderr = p.communicate()
print stdout
print stderr

您正在运行的脚本完全有可能 subprocess.Popen也会生成错误,但不会显示,因为您没有明确查找它。

编辑:

为了防止以下评论中丢失某些信息:

这里可能有几个潜在的错误,或者您可以尝试一些事情。

您的 tcl 脚本本身无法导入 teapot正常,或者 tcl 脚本和 python 脚本之间的某种交互无法正常工作,或者 subprocess.Popen未正确找到 teapot从您的路径中打包。

我会尝试按该顺序调试您的程序。首先确认您的 tcl 脚本可以在不使用 python 或 subprocess.Popen 的情况下工作然后直接从命令行运行它(例如 C:\Users\blah tclsh tcltest.tcl )

然后,在确保脚本正常工作后,引入 Python。据我所知,您的 python 内容没有任何问题,但您的 tcl 脚本或您的路径存在一些问题。

关于python - 通过子进程通过 python 运行 TCL,但不给出任何输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14264118/

相关文章:

python - 如何从文件中获取列表列表以更改为字典

python 3 Tkinter : How to word-wrap text in Tkinter Text

Python GUI 生成数学方程式

python - 如何用 wxPython、PyQt、PySide 或 Tkinter 解释 Python?

python - Mac上的python安装可以强制使用tcl/tk 8.6吗?

list - 如何将 tcl 中的列表用作多个字符串的参数(而不是一个字符串)?

python - 如何按照 python 中 matplotlib 中收到的顺序对条形进行排序?

python - 使用 urllib2 打开页面 - 变音符号

python - BeautifulSoup:如何获取最近的标签

tcl - 我们在 tcl 中有内置的十六进制到二进制的转换吗?