зеркало из https://github.com/mozilla/gecko-dev.git
230 строки
7.3 KiB
Plaintext
230 строки
7.3 KiB
Plaintext
|
which.py -- a portable GNU which replacement
|
||
|
============================================
|
||
|
|
||
|
Download the latest which.py packages from here:
|
||
|
(source) http://trentm.com/downloads/which/1.1.0/which-1.1.0.zip
|
||
|
|
||
|
|
||
|
Home : http://trentm.com/projects/which/
|
||
|
License : MIT (see LICENSE.txt)
|
||
|
Platforms : Windows, Linux, Mac OS X, Unix
|
||
|
Current Version : 1.1
|
||
|
Dev Status : mature, has been heavily used in a commercial product for
|
||
|
over 2 years
|
||
|
Requirements : Python >= 2.3 (http://www.activestate.com/ActivePython/)
|
||
|
|
||
|
|
||
|
What's new?
|
||
|
-----------
|
||
|
|
||
|
I have moved hosting of `which.py` from my old [Starship
|
||
|
pages](http://starship.python.net/~tmick/) to this site. These starter
|
||
|
docs have been improved a little bit. See the [Change Log](#changelog)
|
||
|
below for more.
|
||
|
|
||
|
**WARNING**: If you are upgrading your `which.py` and you also use my
|
||
|
[process.py](../process/) module, you must upgrade `process.py` as well
|
||
|
because of the `_version_/__version__` change in v1.1.0.
|
||
|
|
||
|
|
||
|
Why which.py?
|
||
|
-------------
|
||
|
|
||
|
`which.py` is a small GNU-which replacement. It has the following
|
||
|
features:
|
||
|
|
||
|
- it is portable (Windows, Linux, Mac OS X, Un*x);
|
||
|
- it understands PATHEXT and "App Paths" registration on Windows
|
||
|
(i.e. it will find everything that `start` does from the command shell);
|
||
|
- it can print all matches on the PATH;
|
||
|
- it can note "near misses" on the PATH (e.g. files that match but may
|
||
|
not, say, have execute permissions); and
|
||
|
- it can be used as a Python module.
|
||
|
|
||
|
I also would be happy to have this be a replacement for the `which.py` in the
|
||
|
Python CVS tree at `dist/src/Tools/scripts/which.py` which is
|
||
|
Unix-specific and not usable as a module; and perhaps for inclusion in
|
||
|
the stdlib.
|
||
|
|
||
|
Please send any feedback to [Trent Mick](mailto:TrentM@ActiveState.com).
|
||
|
|
||
|
|
||
|
Install Notes
|
||
|
-------------
|
||
|
|
||
|
Download the latest `which.py` source package, unzip it, and run
|
||
|
`python setup.py install`:
|
||
|
|
||
|
unzip which-1.1.0.zip
|
||
|
cd which-1.1.0
|
||
|
python setup.py install
|
||
|
|
||
|
If your install fails then please visit [the Troubleshooting
|
||
|
FAQ](http://trentm.com/faq.html#troubleshooting-python-package-installation).
|
||
|
|
||
|
`which.py` can be used both as a module and as a script. By default,
|
||
|
`which.py` will be installed into your Python's `site-packages`
|
||
|
directory so it can be used as a module. On *Windows only*, `which.py`
|
||
|
(and the launcher stub `which.exe`) will be installed in the Python
|
||
|
install dir to (hopefully) put `which` on your PATH.
|
||
|
|
||
|
On Un*x platforms (including Linux and Mac OS X) there is often a
|
||
|
`which` executable already on your PATH. To use this `which` instead of
|
||
|
your system's on those platforms you can manually do one of the
|
||
|
following:
|
||
|
|
||
|
- Copy `which.py` to `which` somewhere on your PATH ahead of the system
|
||
|
`which`. This can be a symlink, as well:
|
||
|
|
||
|
ln -s /PATH/TO/site-packages/which.py /usr/local/bin/which
|
||
|
|
||
|
- Python 2.4 users might want to use Python's new '-m' switch and setup
|
||
|
and alias:
|
||
|
|
||
|
alias which='python -m which'
|
||
|
|
||
|
or stub script like this:
|
||
|
|
||
|
#!/bin/sh
|
||
|
python -m which $@
|
||
|
|
||
|
|
||
|
Getting Started
|
||
|
---------------
|
||
|
|
||
|
Currently the best intro to using `which.py` as a module is its module
|
||
|
documentation. Either install `which.py` and run:
|
||
|
|
||
|
pydoc which
|
||
|
|
||
|
take a look at `which.py` in your editor or [here](which.py), or read
|
||
|
on. Most commonly you'll use the `which()` method to find an
|
||
|
executable:
|
||
|
|
||
|
>>> import which
|
||
|
>>> which.which("perl")
|
||
|
'/usr/local/bin/perl'
|
||
|
|
||
|
Or you might want to know if you have multiple versions on your path:
|
||
|
|
||
|
>>> which.whichall("perl")
|
||
|
['/usr/local/bin/perl', '/usr/bin/perl']
|
||
|
|
||
|
Use `verbose` to see where your executable is being found. (On Windows
|
||
|
this might not always be so obvious as your PATH environment variable.
|
||
|
There is an "App Paths" area of the registry where the `start` command
|
||
|
will find "registered" executables -- `which.py` mimics this.)
|
||
|
|
||
|
>>> which.whichall("perl", verbose=True)
|
||
|
[('/usr/local/bin/perl', 'from PATH element 10'),
|
||
|
('/usr/bin/perl', 'from PATH element 15')]
|
||
|
|
||
|
You can restrict the searched path:
|
||
|
|
||
|
>>> which.whichall("perl", path=["/usr/bin"])
|
||
|
['/usr/bin/perl']
|
||
|
|
||
|
There is a generator interface:
|
||
|
|
||
|
>>> for perl in which.whichgen("perl"):
|
||
|
... print "found a perl here:", perl
|
||
|
...
|
||
|
found a perl here: /usr/local/bin/perl
|
||
|
found a perl here: /usr/bin/perl
|
||
|
|
||
|
An exception is raised if your executable is not found:
|
||
|
|
||
|
>>> which.which("fuzzywuzzy")
|
||
|
Traceback (most recent call last):
|
||
|
...
|
||
|
which.WhichError: Could not find 'fuzzywuzzy' on the path.
|
||
|
>>>
|
||
|
|
||
|
There are some other options too:
|
||
|
|
||
|
>>> help(which.which)
|
||
|
...
|
||
|
|
||
|
Run `which --help` to see command-line usage:
|
||
|
|
||
|
$ which --help
|
||
|
Show the full path of commands.
|
||
|
|
||
|
Usage:
|
||
|
which [<options>...] [<command-name>...]
|
||
|
|
||
|
Options:
|
||
|
-h, --help Print this help and exit.
|
||
|
-V, --version Print the version info and exit.
|
||
|
|
||
|
-a, --all Print *all* matching paths.
|
||
|
-v, --verbose Print out how matches were located and
|
||
|
show near misses on stderr.
|
||
|
-q, --quiet Just print out matches. I.e., do not print out
|
||
|
near misses.
|
||
|
|
||
|
-p <altpath>, --path=<altpath>
|
||
|
An alternative path (list of directories) may
|
||
|
be specified for searching.
|
||
|
-e <exts>, --exts=<exts>
|
||
|
Specify a list of extensions to consider instead
|
||
|
of the usual list (';'-separate list, Windows
|
||
|
only).
|
||
|
|
||
|
Show the full path to the program that would be run for each given
|
||
|
command name, if any. Which, like GNU's which, returns the number of
|
||
|
failed arguments, or -1 when no <command-name> was given.
|
||
|
|
||
|
Near misses include duplicates, non-regular files and (on Un*x)
|
||
|
files without executable access.
|
||
|
|
||
|
|
||
|
Change Log
|
||
|
----------
|
||
|
|
||
|
### v1.1.0
|
||
|
- Change version attributes and semantics. Before: had a _version_
|
||
|
tuple. After: __version__ is a string, __version_info__ is a tuple.
|
||
|
|
||
|
### v1.0.3
|
||
|
- Move hosting of which.py to trentm.com. Tweaks to associated bits
|
||
|
(README.txt, etc.)
|
||
|
|
||
|
### v1.0.2:
|
||
|
- Rename mainline handler function from _main() to main(). I can
|
||
|
conceive of it being called from externally.
|
||
|
|
||
|
### v1.0.1:
|
||
|
- Add an optimization for Windows to allow the optional
|
||
|
specification of a list of exts to consider when searching the
|
||
|
path.
|
||
|
|
||
|
### v1.0.0:
|
||
|
- Simpler interface: What was which() is now called whichgen() -- it
|
||
|
is a generator of matches. The simpler which() and whichall()
|
||
|
non-generator interfaces were added.
|
||
|
|
||
|
### v0.8.1:
|
||
|
- API change: 0.8.0's API change making "verbose" output the default
|
||
|
was a mistake -- it breaks backward compatibility for existing
|
||
|
uses of which in scripts. This makes verbose, once again, optional
|
||
|
but NOT the default.
|
||
|
|
||
|
### v0.8.0:
|
||
|
- bug fix: "App Paths" lookup had been crippled in 0.7.0. Restore that.
|
||
|
- feature/module API change: Now print out (and return for the module
|
||
|
interface) from where a match was found, e.g. "(from PATH element 3)".
|
||
|
The module interfaces now returns (match, from-where) tuples.
|
||
|
- bug fix: --path argument was broken (-p shortform was fine)
|
||
|
|
||
|
### v0.7.0:
|
||
|
- bug fix: Handle "App Paths" registered executable that does not
|
||
|
exist.
|
||
|
- feature: Allow an alternate PATH to be specified via 'path'
|
||
|
optional argument to which.which() and via -p|--path command line
|
||
|
option.
|
||
|
|
||
|
### v0.6.1:
|
||
|
- first public release
|
||
|
|