【问题标题】:I need to run a TCL script in python, my TCL script also has a user-defined(internal) package我需要在 python 中运行一个 TCL 脚本,我的 TCL 脚本也有一个用户定义的(内部)包
【发布时间】:2013-01-15 16:59:15
【问题描述】:

我需要在 python 中运行一个 TCL 脚本,我的 TCL 脚本也有一个用户定义的(内部)包 我尝试了这些脚本:

1.

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 XXX')
 tcl_script ="""
package require XXX
set YYY [COMMAND FROM PACKAGE]
puts $YYY 
} """
 # 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"

和,

2.

import Tkinter
root=Tkinter.Tk()
root.tk.eval('package require XXX')
root.tk.eval('set YYY COMMAND')

返回关于 sdtout 的错误!

另一个:

3.

 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

返回以下错误:

can't find package __teapot__

    while executing

"package require __teapot__"

他们都不工作,请帮我解决这个问题!

我可以使用以下代码在我们的产品上操作一些命令:

import socket
import time

def Sckt():
 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 s.connect(('127.0.0.1', 5006))

 s.send('0 COMMAND \r\n')

这会给你一些想法!

谢谢,

【问题讨论】:

  • 你确定 tcl-code 是独立运行的吗?试试tclsh tcltest.tcl 错误似乎来自 tcl,所以你的 tcl 周围的 python 可能只会让你更难理解潜在的问题。
  • 是的,我运行了几次脚本,它工作正常。问题出在python无法识别!
  • 我在这里添加了另一个问题的答案:stackoverflow.com/a/61623719/5626983

标签: python tcl


【解决方案1】:

对于不属于您的供应商安装的自定义包,您需要指示 Tcl 从何处搜索它。为此,请将包含包的目录的 parent 目录附加到 Tcl 的全局 auto_path 变量中。例如,如果 XXX 包在目录 /home/amir/.tclpackages/XXX1.0 中,那么您将让您的脚本执行以下操作:

lappend auto_path /home/amir/.tclpackages

这可以在Tcl 脚本中package require XXX 之前的任何位置。 (好吧,你可以把它放在后面,但是package require 会失败……)

【讨论】:

  • 实际上我将该命令添加到我的 tcl 脚本中。但我的问题是我是否应该把那个包放在我的 python27 文件夹中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 2016-09-16
  • 2017-10-26
相关资源
最近更新 更多