1

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')

それはあなたにいくつかのアイデアを与えるでしょう!

感謝、

4

1 に答える 1

1

ベンダーのインストールに含まれていないカスタム パッケージの場合、どこから検索するかを Tcl に指示する必要があります。これを行うには、パッケージを含むディレクトリのディレクトリを Tcl のグローバルauto_path変数に追加します。たとえば、XXX パッケージがディレクトリ/home/amir/.tclpackages/XXX1.0にある場合、スクリプトは次のようになります。

lappend auto_path /home/amir/.tclpackages

これは、Tcl スクリプト内のpackage require XXX. (まぁ、後から入れることもできますが、package require失敗してしまいます…)

于 2013-01-16T09:30:38.040 に答える