[HN Gopher] Show HN: Clamshell- an experimental Python based shell
___________________________________________________________________
Show HN: Clamshell- an experimental Python based shell
About a month ago I started a suprisingly-not-that tricky project
to build an experimental python repl that I could use instead of
bash as a daily shell in windows, mac or linux. It"s more hack-for-
exploration than a production ready shell, but here it is! Hope
somebody finds it anywhere near as interesting to check out as I
found making it. Disclaimer: I know about xonsh and love it (if
you haven't heard of it, google it). This project is more pure
python and less python and bash interacting - see the readme for
more details.
Author : benrutter
Score : 40 points
Date : 2023-01-28 14:28 UTC (8 hours ago)
(HTM) web link (github.com)
(TXT) w3m dump (github.com)
| slig wrote:
| Slightly off-topic: can anyone recommend a nice framework /
| library to replace "bash scripts" with Python? For instance, I
| don't want to deal with subprocess manually.
| 0x6c6f6c wrote:
| Something for Python akin to zx for JavaScript?
|
| https://github.com/google/zx
| goffi wrote:
| `sh` is great for that: https://amoffat.github.io/sh/
| woolion wrote:
| Nowadays I just use bash because alternative shells often won't
| be available in dev environments, CI, etc, so bash cannot be
| avoided anyway. But in the past I've used Python to generate
| bash script to avoid having to do tricky processing in bash. By
| piping that into vim you can check the resulting commands
| before execution in a simple command.
|
| It's a really dumb solution and can work in any
| language/environment, so I like it.
| alxprc wrote:
| Maybe Plumbum: https://plumbum.readthedocs.io/en/latest/
| pard68 wrote:
| Tiny nit, the logo is an oyster, not a clam.
| Operyl wrote:
| Probably because there isn't a clam emoji, just an oyster one.
| That's surprising to me.
| benrutter wrote:
| This was the exact reason! I should have named it something
| train themed, then the emoji choice would have been a lot
| better
| teddyh wrote:
| But there is a "shell" emoji: https://emojipedia.org/spiral-
| shell/
| benrutter wrote:
| True! but the shell was very similar to xonsh's shell, so I
| figured an oyster was the least confusing choice
| kwertyops wrote:
| ~/me $_ x = files('Music') ~/me $_ for item in x:
| > if 'Rick Astley' not in x['name']: >
| delete(x['path'])
|
| Shouldn't that be: ~/me $_ x = files('Music')
| ~/me $_ for item in x: > if 'Rick Astley' not in
| item['name']: > delete(item['path'])
| ?
| totetsu wrote:
| on purpose to stop unwary copy pasting?
| benrutter wrote:
| Haha, thanks! That's such an immensely charitable
| interpretation of my messy typo- I'll update the readme so
| people can copy paste there music collection into non-
| existence if they feel like it. (Luckily it'll just go to the
| recycle bin so those Bananarama mp3s are still recoverable)
| thenipper wrote:
| This is really neat! I've been working on a "shell" that I use
| for running RPG games in python. I might have to see if I can
| piggyback off of this.
| randomluck040 wrote:
| Can you elaborate on the ,,running RPG games in python" please?
| thenipper wrote:
| Sure.. basically i've been fiddling with creating a 'shell'
| that lets me at the simplest level do something like this:
| roll 1d20 You rolled an 18 roll
| goblin.attacks.shortsword You rolled an 4 on 1d6.
| apply roll goblin.attacks.shortsword to character.hp
|
| The other part will be that it'll let me connect into a
| foundry instance and have the chat/rolls show up on my
| terminal.
| randomluck040 wrote:
| Thanks for elaborating. Sounds pretty cool actually. Do you
| have it on GitHub or something?
| thenipper wrote:
| Not yet. I should sometime soon but life/family/work
| keeps coming up.
|
| If you want you can drop an email to Sam at phin.tech and
| I can email you if/when it comes out.
| traverseda wrote:
| I wish that xonsh took some inspiration from this, allowing
| "super commands" that return python objects, which can then be
| piped to normal commands. I want to be able to do things like
| for file in ls: if file.is_mount():
| try: fusermount -u @(file) except:
| print(f"Couldn't unmount {file}")
|
| Or more complicated stuff involving piping actual live python
| objects around. Xonsh is great, but the lack of what you're
| calling "super commands" does limit things a fair bit.
|
| Right now I can do similar stuff, but I often end up doing
| horrible things like for file in
| $(ls).split("\n"): file=Path(file)
|
| which is not nearly as elegant, especially for more complicated
| stuff. Lots of places for issues to sneak in, like I'm pretty
| sure that splitting the output of ls like I did there gives me an
| extra null directory at the end of the output, not an issue here
| but it is one more spot for bugs to sneak in.
|
| Of course the other problem with these "super commands" is that
| they all have to exist in your master shell process. I wonder if
| you could use something like RPyC to have live python objects
| that are fully interactable but which live in other processes.
| elesiuta wrote:
| I made a somewhat related program called pyxargs[1] which may
| help with what you're looking for. The command for your example
| would be pyxargs --py "print('{}') if
| os.path.ismount('{}') else ''" | pyxargs -m stdin fusermount -u
| {}
|
| [1] https://github.com/elesiuta/pyxargs
| benrutter wrote:
| Thanks! Glad you enjoyed looking over it- that's exactly how I
| feel about xonsh. Having python in the shell feels great, but
| I'm always left feeling like I have a marriage of something I
| like with something I like less (not to hate on bash too much)
| rather than just the shell I want in the first place.
|
| Really cool idea about separate processes- I guess since the
| shell is its own thing, there's no reason you couldn't write an
| interpreter in a non-GIL language (like rust or c++) even if
| the commands where Python. That'd free you up to spawn
| subprocesses and shells to your heart's content!
| upbeat_general wrote:
| Slightly off-topic: Does anyone have a recommendation for a pdb
| alternative?
|
| I've found most of the alternatives have a high (for my use case)
| learning curve. For real debugging I use VSCode but it's nice to
| be able to quickly throw breakpoints around.
| benrutter wrote:
| There's some interesting projects like pubd, but I'd massively
| recommend ipdb. Its basically what I wish pdb was- i.e syntax
| highlighting, multilinear editing, completion hints etc
| jmuhlich wrote:
| I like pdbpp. Make sure to install from source as there hasn't
| been a release in a while.
|
| https://github.com/pdbpp/pdbpp
| w-m wrote:
| If you're an iPython user, you may enjoy ipdb:
| https://pypi.org/project/ipdb/
___________________________________________________________________
(page generated 2023-01-28 23:01 UTC)