【问题标题】:Calling Python code from TCL and checking its return value从 TCL 调用 Python 代码并检查其返回值
【发布时间】:2019-08-07 06:02:03
【问题描述】:

我需要在 TCL 脚本中调用 Python 代码并检查其退出状态以确定 Python 代码是否成功执行。

TCL 脚本:

if {[catch {exec "python C:\\tools\\tcl\\myexamples\\sample.py"} results] == 0 } {
    puts "No Error $results"
} else {
    puts "Error $results"
}

Python 代码:

import sys

def main():
    return 0

if __name__ == '__main__':
    return main()

但是,当我执行 TCL 脚本时,出现以下错误:

$ tclsh85.exe  ../myexamples/1.tcl
Error couldn't execute "python C:\tools\tcl\myexamples\sample.py": no such file or directory

但是文件确实存在:

C:\tools\tcl\myexamples>dir sample.py
Directory of C:\tools\tcl\myexamples
07-08-2019  11:23 AM               199 sample.py
1 File(s)            199 bytes

问题是什么,我该如何解决?

【问题讨论】:

  • 我的 TCL 生锈了,但我认为 TCL 脚本正在尝试将“python c:\\tools\\etc”作为文件路径执行......似乎 exec 可以使用多个命令行论据。 wiki.tcl-lang.org/page/exec,所以你不需要引号。
  • 正如@aschultz 所说,TCL 似乎认为这是一个命令。也许在 python 之后关闭引号并再次打开它们以获取 python 脚本的路径。

标签: python tcl


【解决方案1】:

exec 命令将脚本的每个参数作为单独的 Tcl 参数。这意味着简单的解决方法是改变:

exec "python C:\\tools\\tcl\\myexamples\\sample.py"

到:

exec python "C:\\tools\\tcl\\myexamples\\sample.py"

但实际上我更喜欢写:

exec python [file nativename C:/tools/tcl/myexamples/sample.py]

或者,如果它与当前 Tcl 脚本在同一目录中:

exec python [file nativename [file join [file dirname [info script]] sample.py]]

一般来说,其中一些是您将在脚本开始时记录的内容:

set ThisDir [file normalize [file dirname [info script]]]

然后你就可以这样做了:

exec python [file nativename [file join $ThisDir sample.py]]

【讨论】:

  • 这样可以避免使用pwd 来获取当前工作目录。这可能与$ThisDir 相同……也可能不同……
【解决方案2】:

对于 exec,只有带空格的参数需要引号,而不是整个参数列表。

使用 TKCon 2.7(来自 ActiveState TCL 8.6 的安装)我尝试了以下操作:

exec "python c:\\writing\\scripts\\my_py.py"

找不到“python c:\writing\scripts\my_py.py”。

exec python c:\\writing\\scripts\\my_py.py

正确运行脚本。 exec "python" "c:\\writing\\scripts\\my_py.py".也一样

创建一个名为 my_py space.py 的 my_py.py 副本,然后运行

exec python "c:\\writing\\scripts\\my_py space.py"

还正确地运行了脚本。

所以看起来 exec 只需要为带有空格的单个参数加上引号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-29
    • 2014-03-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    相关资源
    最近更新 更多