Mount python — it's fun, not a typo, and next to pointless!
pyfs is a FUSE implementation that gives a filesystem view on Python modules.
Why is that cool? You can do stuff like this:
lib$ os/path/join /this is a path
/this/is/a/path
Yes, that's os.path.join
doing the work. Or look at this:
lib$ string/capwords "let's do some python … not."
Let's Do Some Python … Not.
lib$ string/capwords once-more-unto-the-breach -
Once-More-Unto-The-Breach
You can have a look at the docstring, if need be:
lib$ os/path/join -h
usage: join [-h] [funcargs [funcargs ...]]
Join two or more pathname components, inserting '/' as needed. If any
component is an absolute path, all previous path components will be discarded.
An empty last part will result in a path that ends with a separator.
positional arguments:
funcargs
optional arguments:
-h, --help show this help message and exit
~/test-pyfs$
Come on, that is cool, yes? Sure, it's a whee bit superfluous, a solution to no problem, but, hey, it'll get much better soon! Promise!
The whole thing started, when I had a look at Python's FUSE modules. If you want an overview about those, go over there.
How does the root of the mountpoint look like? For example, like so:
$ tree -L 2
.
├── bin
├── dot
├── lib
│ ├── __builtin__
│ ├── json
│ ├── os
│ ├── re
│ ├── string
│ └── sys
└── run
└── modules
(Slightly cut.)
Wonder what run/modules
does? It's a file. You can cat
it:
$ cat run/modules
sys
json
os
string
__builtin__
But, you can also add modules:
$ echo re >> run/modules
$ ls lib
__builtin__ json os re string sys
And then you can use it:
$ lib/re/match "\d+a" 33434a
<_sre.SRE_Match object at 0x10641d0>
Or, you can get rid of the imported modules:
$ echo > run/modules
$ ls lib/
$ cat run/modules
$
Use pipes to concatenate Python commands. The dash character, “-”, marks the place where each element should go.
lib$ echo Hello World | string/index - Wor | string/zfill - 10
0000000006
Add bin/ to your PATH and get everything from builtin readily available:
$ pow 2 10
1024
You can access attributes of an object using the directory dot
. The attribute names cannot be resolved automatically, but if you know what you want, you'll get it.
echo Hallo | dot/__doc__
str(object='') -> string
Return a nice string representation of the object.
If the argument is a string, the return value is the same object.
If the attribute is callable, it will be called with the given arguments.
$ echo Hello world | dot/split | lib/string/join ' -> '
Hello -> world
$ echo Hello=world | dot/split = | lib/string/join ' -> '
Hello -> world
Get fusepy.
pip install fusepy
Clone the repo and run:
mkdir mountpoint
python -m pyfs.filesystem mountpoint
(No pip package / setup.py just yet, sorry!)
In the dir mountpoint
you'll find the filesystem to play with.
Unmount using:
fusermount -u mountpoint
- Transform arguments by introspection:
- positional parameters are made explicit by adding them to the argparse Parser
- keyword parameters are turned into optional argparse arguments
$ lib/SimpleHttpServer/.self 8080 # python -m SimpleHttpServer 8080
- provide a meta function to install packages in some virtualenv, so they can be loaded. (can I create a virtualenv at startup in memory and use that? /temp would be another option)
To be continued …