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

问题描述 投票:0回答:4

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


    

tcl package
4个回答
21
投票
事情没那么简单:Tcl 中的包看起来比 Python 中的包更抽象。

首先,有两种包:“classic”和

“modules”,它们具有不同的底层机制,用于查找响应 package require ...

 命令加载的内容。

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

    纯 Tcl 软件包,
  • source
    仅包含一个 Tcl 文件或任意数量的文件。
  • 用 C 或其他编译语言实现的包,以动态库的形式,当需要包时会得到
  • load
    ed。
  • 当有 C 库和围绕它的 Tcl 代码层时(通常提供帮助器/便利命令),以上的组合。
因此,这个问题本身没有什么意义,因为只有

modules 由一个独立的文件表示,但“经典”包可以自由地实现它们认为合适的自身。

另一方面,每个包通常向包子系统提供(使用某种方式)某些信息,可以使用

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
加载包,因此解析此信息本质上是临时且脆弱的。


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

join $::auto_path \n
    

0
投票
本手册涉及 auto_path 和其他可加载库变量:

https://www.systutorials.com/docs/linux/man/n-auto_path/ 可以在 tclsh 中添加新的或缺失的可加载包搜索目录: lappend auto_path /new_directoty


0
投票
如前所述,TCL 的内务管理能力是

…… 我用一个简单的技巧来做到这一点......

package provide lib_filter 1.0 namespace eval lib_filter { variable self [info script] .... }
变量

lib_filter::self

具有路径,可以轻松进行测试。
这适用于
script,也适用于C,但必须由程序员添加。

© www.soinside.com 2019 - 2024. All rights reserved.