Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

tcl - how to find the path of package loaded?

In tcl how does one find out the path of the package loaded?

% tclsh
% package require csv

I want to find out the path from which csv was loaded.

In python, one can find the path of a module using

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

I am looking for a similar command in tcl

like image 530
Anand Avatar asked May 30 '12 16:05

Anand


People also ask

How do packages work in TCL?

The recommended way to use packages in Tcl is to invoke package require and package provide commands in scripts, and use the procedure pkg_mkIndex to create package index files. Once you have done this, packages will be loaded automatically in response to package require commands.

What is Tcllibpath?

$env(TCLLIBPATH) is a list of directories to add to $auto_path, which in turn is used by facilities such as package unknown to search for packages.


2 Answers

It's not that simple: a package in Tcl appears to be a more abstract thing than that in Python.

First, there are two kinds of packages: "classic" and "modules" which have different underlying mechanisms for finding what to load in response to the package require ... command.

Next, both kinds of packages are able to do whatever they wish to provide their functionality. It means they can be (but not limited to):

  • Pure Tcl packages, source'ing just one Tcl file or any number of files.
  • Packages implemented in C or another compiled language, which are in the form of dynamic library which gets loaded when the package is required.
  • A combination of the above, when there's a C library and a layer of Tcl code around it (usually providing helper/convenience commands).

Hence the question per se has little sense as only modules are represented by exactly one self-contained file but "classic" packages are free to implement themselves as they see fit.

On the other hand, each package normally provides (using one way or another) certain information to the package subsystem which can be retreived (and parsed) using the package ifneeded command. For instance, on my Windows system with ActiveState Tcl 8.5.x, I have:

% 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}

Note that what package ifneeded returns is just a Tcl script which is meant to be evaluated to get the package loaded, so parsing of this information is bound to be inherently ad-hoc and fragile.

like image 196
kostix Avatar answered Oct 20 '22 07:10

kostix


For Tcl packages you can view list of all loadedable path dirs by command:

join $::auto_path \n
like image 37
syox Avatar answered Oct 20 '22 07:10

syox