Hacker News new | ask | show | jobs
by ben509 2308 days ago
Perl's big win for one-liners is braces syntax. Interestingly, there are already projects to add braces syntax[1].

Two of the three Perl features are also Python features, namely -m to run a module and -c to run code on the command line.

Regarding Perl being a better shell, there are modules like `doit` and `invoke` that make Python far better than perl for managing jobs, precisely because they make forking off jobs super easy.

But now that you mention it... I want to write a module to make python one-liners easy.

[1]: https://pypi.org/project/brackets/

1 comments

Can you show an example of using doit and invoke to fork off jobs in Python? I’m pretty sure Perl has had similar functionality for some time.
Yeah, perl borrows backticks from bash[3], so it's giving you syntax to do it directly, and it's long had strong support for opening a process using a very intuitive syntax.

Python's subprocess module works quite well, but gets extremely verbose[4] as you try to do anything more complex than "run a command and get the output" and has some nasty gotchas[2].

I forget the invoke syntax, but doit[1] is basically a make replacement so calling the shell is pretty easy:

    def task_something():
        return {'actions': ['ls foo/', 'rm -r foo']}
And you can use outputs from one task as inputs for another, it tracks what's been done, etc.

[1]: https://pydoit.org/

[2]: https://docs.python.org/3/library/subprocess.html#subprocess...

[3]: https://perldoc.perl.org/5.30.0/perlop.html#qx%2f_STRING_%2f

[4]: https://docs.python.org/3/library/subprocess.html#popen-cons...

How can one do something like fork/exec in python? That's what I was thinking of when you mentioned "forking off jobs".

There are a number of different ways to launch an external process from Perl, I think this StackOverflow answer summarizes them quite well:

https://stackoverflow.com/a/800105

I'm an experienced Perl user, but I'm not as familiar with Python. In addition, I'm not really using Perl for sysadmin stuff, so I tend to try to keep stuff "within" Perl. As an example, I'd rather use the File::Find module than use backticks to invoke `find`. This has really nothing to do with functionality - I'm almost always on Linux, and the syntaxes are similarly hairy - it's just that usually you get more powerful functionality using the Perl functionality.

(edit rearranged paragraphs)