运行 来自 python 的带参数的 tcl 脚本

Running tcl script from python with arguments

我正在尝试 运行 来自 python 的 tcl 脚本, tcl 脚本需要命令行参数才能执行,当我从 python 获取 tcl 文件时,它会显示错误

tclsh.eval('source "test.tcl"' )
_tkinter.TclError: can't read "::argv": no such variable

我做了很多搜索,其中大部分都询问如何在 tcl 中将参数传递给 python。

python代码

import tkinter
import sys 
tclsh.eval('source "test.tcl"' )
if __name__ == '__main__':
    print("hi")

tcl 代码

puts [lindex $::argv 0]

我是否可以将 python 参数传递给 tcl?

不传递参数仍然编译?

因为如果我只编译不带参数的 tcl 脚本,它仍然可以编译

注:

在 tkinter 文档中它说 tkinter.Tk 是

The Tk class is instantiated without arguments

有没有办法用参数实例化?

索尔:

tclsh.eval('set argv [list]')
tclsh.eval('set argc 0')

我尝试设置一个全局变量,它在 python 3.6

下对我有用

全局 argv 变量,除了在标准 Tcl 脚本启动期间设置外,没有任何特殊之处。因此,您可以在执行 source 之前设置它。在这种情况下,在循环中使用 lappend 可能是最好的,因为它可以正确构建变量的结构。还有两个其他变量也应该设置(argcargv0);总的来说你是这样做的(作为一个方便的功能):

def run_tcl_script(script_name, *args):
    tclsh.eval('set argv0 {{{}}}'.format(script_name))
    tclsh.eval('set argv {}; set argc 0')
    for a in args:
        tclsh.eval('lappend argv {{{}}}; incr argc'.format(a))
    tclsh.eval('source $argv0')

{{{}}} 和 Python 的 str.format 导致 单层 括号围绕参数,防御 引用问题。