ipy_rehashdir.py
140 lines
| 4.2 KiB
| text/x-python
|
PythonLexer
fperez
|
r281 | # -*- coding: utf-8 -*- | ||
""" IPython extension: add %rehashdir magic | ||||
Usage: | ||||
%rehashdir c:/bin c:/tools | ||||
Bernardo B. Marques
|
r4872 | - Add all executables under c:/bin and c:/tools to alias table, in | ||
fperez
|
r281 | order to make them directly executable from any directory. | ||
Bernardo B. Marques
|
r4872 | |||
fperez
|
r281 | This also serves as an example on how to extend ipython | ||
with new magic functions. | ||||
Unlike rest of ipython, this requires Python 2.4 (optional | ||||
extensions are allowed to do that). | ||||
""" | ||||
Brian Granger
|
r2027 | from IPython.core import ipapi | ||
ip = ipapi.get() | ||||
fperez
|
r281 | |||
vivainio
|
r801 | import os,re,fnmatch,sys | ||
fperez
|
r281 | |||
vivainio
|
r833 | def selflaunch(ip,line): | ||
vivainio
|
r801 | """ Launch python script with 'this' interpreter | ||
Bernardo B. Marques
|
r4872 | |||
vivainio
|
r841 | e.g. d:\foo\ipykit.exe a.py | ||
Bernardo B. Marques
|
r4872 | |||
vivainio
|
r801 | """ | ||
Bernardo B. Marques
|
r4872 | |||
vivainio
|
r841 | tup = line.split(None,1) | ||
if len(tup) == 1: | ||||
print "Launching nested ipython session" | ||||
os.system(sys.executable) | ||||
return | ||||
Bernardo B. Marques
|
r4872 | |||
vivainio
|
r841 | cmd = sys.executable + ' ' + tup[1] | ||
vivainio
|
r801 | print ">",cmd | ||
os.system(cmd) | ||||
class PyLauncher: | ||||
""" Invoke selflanucher on the specified script | ||||
Bernardo B. Marques
|
r4872 | |||
vivainio
|
r801 | This is mostly useful for associating with scripts using:: | ||
Brian Granger
|
r2205 | _ip.define_alias('foo',PyLauncher('foo_script.py')) | ||
Bernardo B. Marques
|
r4872 | |||
vivainio
|
r801 | """ | ||
def __init__(self,script): | ||||
self.script = os.path.abspath(script) | ||||
vivainio
|
r833 | def __call__(self, ip, line): | ||
vivainio
|
r841 | if self.script.endswith('.ipy'): | ||
ip.runlines(open(self.script).read()) | ||||
else: | ||||
vivainio
|
r861 | # first word is the script/alias name itself, strip it | ||
tup = line.split(None,1) | ||||
if len(tup) == 2: | ||||
tail = ' ' + tup[1] | ||||
else: | ||||
tail = '' | ||||
Bernardo B. Marques
|
r4872 | |||
vivainio
|
r861 | selflaunch(ip,"py " + self.script + tail) | ||
vivainio
|
r801 | def __repr__(self): | ||
return 'PyLauncher("%s")' % self.script | ||||
vivainio
|
r841 | |||
fperez
|
r281 | def rehashdir_f(self,arg): | ||
""" Add executables in all specified dirs to alias table | ||||
Bernardo B. Marques
|
r4872 | |||
fperez
|
r281 | Usage: | ||
%rehashdir c:/bin;c:/tools | ||||
Bernardo B. Marques
|
r4872 | - Add all executables under c:/bin and c:/tools to alias table, in | ||
fperez
|
r281 | order to make them directly executable from any directory. | ||
Bernardo B. Marques
|
r4872 | |||
fperez
|
r281 | Without arguments, add all executables in current directory. | ||
Bernardo B. Marques
|
r4872 | |||
fperez
|
r281 | """ | ||
# most of the code copied from Magic.magic_rehashx | ||||
def isjunk(fname): | ||||
junk = ['*~'] | ||||
for j in junk: | ||||
if fnmatch.fnmatch(fname, j): | ||||
return True | ||||
return False | ||||
Bernardo B. Marques
|
r4872 | |||
vivainio
|
r687 | created = [] | ||
fperez
|
r281 | if not arg: | ||
arg = '.' | ||||
path = map(os.path.abspath,arg.split(';')) | ||||
Brian Granger
|
r2245 | alias_table = self.shell.alias_manager.alias_table | ||
Bernardo B. Marques
|
r4872 | |||
fperez
|
r281 | if os.name == 'posix': | ||
isexec = lambda fname:os.path.isfile(fname) and \ | ||||
os.access(fname,os.X_OK) | ||||
else: | ||||
try: | ||||
winext = os.environ['pathext'].replace(';','|').replace('.','') | ||||
except KeyError: | ||||
winext = 'exe|com|bat|py' | ||||
vivainio
|
r380 | if 'py' not in winext: | ||
winext += '|py' | ||||
Bernardo B. Marques
|
r4872 | |||
fperez
|
r281 | execre = re.compile(r'(.*)\.(%s)$' % winext,re.IGNORECASE) | ||
isexec = lambda fname:os.path.isfile(fname) and execre.match(fname) | ||||
Jörgen Stenarson
|
r4208 | savedir = os.getcwdu() | ||
fperez
|
r281 | try: | ||
# write the whole loop for posix/Windows so we don't have an if in | ||||
# the innermost part | ||||
if os.name == 'posix': | ||||
for pdir in path: | ||||
os.chdir(pdir) | ||||
for ff in os.listdir(pdir): | ||||
if isexec(ff) and not isjunk(ff): | ||||
# each entry in the alias table must be (N,name), | ||||
# where N is the number of positional arguments of the | ||||
# alias. | ||||
vivainio
|
r687 | src,tgt = os.path.splitext(ff)[0], os.path.abspath(ff) | ||
Bernardo B. Marques
|
r4872 | created.append(src) | ||
fperez
|
r281 | alias_table[src] = (0,tgt) | ||
else: | ||||
for pdir in path: | ||||
os.chdir(pdir) | ||||
for ff in os.listdir(pdir): | ||||
if isexec(ff) and not isjunk(ff): | ||||
src, tgt = execre.sub(r'\1',ff), os.path.abspath(ff) | ||||
vivainio
|
r649 | src = src.lower() | ||
Bernardo B. Marques
|
r4872 | created.append(src) | ||
fperez
|
r281 | alias_table[src] = (0,tgt) | ||
# Make sure the alias table doesn't contain keywords or builtins | ||||
self.shell.alias_table_validate() | ||||
# Call again init_auto_alias() so we get 'rm -i' and other | ||||
# modified aliases since %rehashx will probably clobber them | ||||
vivainio
|
r543 | # self.shell.init_auto_alias() | ||
fperez
|
r281 | finally: | ||
os.chdir(savedir) | ||||
vivainio
|
r687 | return created | ||
vivainio
|
r801 | |||
Brian Granger
|
r2205 | ip.define_magic("rehashdir",rehashdir_f) | ||