9

如何tcl找到加载的包的路径?

% tclsh
% package require csv

我想找出csv加载的路径。

在python中,可以使用找到模块的路径

>>> import os
>>> print os.__file__
'/a/b/python2.2.1/linux26_x86_64/lib/python2.2/os.pyc'

我正在寻找类似的命令tcl

4

3 回答 3

21

事情没那么简单:Tcl 中的包似乎比 Python 中的包更抽象。

首先,有两种包:“经典”和“模块”,它们具有不同的底层机制来查找响应package require ...命令加载的内容。

接下来,这两种包都可以做任何他们想做的事情来提供他们的功能。这意味着它们可以是(但不限于):

  • 纯 Tcl 包,source只需要一个 Tcl 文件或任意数量的文件。
  • 用 C 或其他编译语言实现的包,以动态库的形式在load需要包时获取。
  • 以上的组合,当有一个 C 库和一层 Tcl 代码围绕它时(通常提供帮助/便利命令)。

因此,这个问题本身没有什么意义,因为只有一个模块由一个独立的文件表示,但“经典”包可以自由地按照他们认为合适的方式实现自己。

另一方面,每个包通常会(使用一种或另一种方式)向包子系统提供某些信息,这些信息可以使用package ifneeded命令检索(和解析)。例如,在我的带有 ActiveState Tcl 8.5.x 的 Windows 系统上,我有:

% package require csv
0.7.2
% package ifneeded csv 0.7.2
package provide csv 0.7.2;source -encoding utf-8 {C:/Program Files/Tcl/lib/teapot/package/tcl/teapot/tcl8/8.3/csv-0.7.2.tm}

请注意,package ifneeded返回的只是一个Tcl 脚本,该脚本旨在用于eval加载包,因此对该信息的解析必然是固有的临时和脆弱的。

于 2012-05-30T17:37:11.677 回答
4

对于 Tcl 包,您可以通过以下命令查看所有可加载路径目录的列表:

join $::auto_path \n
于 2017-03-26T23:16:24.293 回答
0

本手册涉及 auto_path 和其他可加载库变量:https://www.systutorials.com/docs/linux/man/n-auto_path/ 可以在 tclsh 中添加新的或缺少的可加载包搜索目录: lappend auto_path /new_directoty

于 2019-05-24T16:01:28.817 回答