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

时间:2012-05-30 16:05:00

标签: tcl packages

tcl中如何找出加载包的路径?

% tclsh
% package require csv

我想找出加载csv的路径。

在python中,可以使用

find the path of a module
>>> import os
>>> print os.__file__
'/a/b/python2.2.1/linux26_x86_64/lib/python2.2/os.pyc'

我在tcl

中寻找类似的命令

3 个答案:

答案 0 :(得分:15)

这并不是那么简单:Tcl中的包似乎比Python更抽象。

首先,有两种软件包:“经典”和"modules",它们具有不同的底层机制,可以找到响应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用于加载包,因此解析此信息必定是本质上是临时的和脆弱的。

答案 1 :(得分:2)

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

join $::auto_path \n

答案 2 :(得分:0)

本手册介绍了auto_path和其他可加载的库变量:https://www.systutorials.com/docs/linux/man/n-auto_path/ 可以在tclsh中添加新的或缺少的可装入软件包搜索目录: 附加auto_path / new_directoty