Critic my module
Devyn Collier Johnson
devyncjohnson at gmail.com
Sat Jul 27 20:06:34 CEST 2013
On 07/27/2013 11:14 AM, Jason Swails wrote:
> You've gotten plenty of good advice from people discussing the coding
> and coding style itself, I'll provide some feedback from the vantage
> point of a perspective user.
> On Thu, Jul 25, 2013 at 9:24 AM, Devyn Collier Johnson
> <devyncjohnson at gmail.com <mailto:devyncjohnson at gmail.com>> wrote:
> Aloha Python Users!
> I made a Python3 module that allows users to use certain Linux
> shell commands from Python3 more easily than using os.system(),
> subprocess.Popen(), or subprocess.getoutput(). This module (once
> placed with the other modules) can be used like this
> import boash; boash.ls <http://boash.ls>()
> I actually wrote a program recently in which I wanted access to unix
> "ls" command, and I wanted it to behave as close to the real, UNIX
> "ls" as possible.
> This would seem like a perfect use-case for your module, but the
> problem is that the 'ls' command in your module does not behave much
> like the real 'ls' command. You never let any of the 'system'
> commands in your module access any arguments. More often than not, I
> use "ls" with several command-line arguments, like:
> ls --color=auto -lthr dir_basename*/
> Even if you're just spawning 'ls' directly, this is actually
> non-trivial to implement. You need globbing on all non-option
> arguments, you may want to pass up the return code somehow, depending
> on what the user wants to do:
> [bash ]$ ls nodir
> ls: nodir: No such file or directory
> [bash ]$ echo $?
> Also, 'ls' in the terminal behaves like "ls -C" when called from your
> module. In the framework of my program, my 'ls' command looks like this:
> class ls(Action):
> Lists directory contents. Like UNIX 'ls'
> needs_parm = False
> def init(self, arg_list):
> from glob import glob
> self.args = 
> # Process the argument list to mimic the real ls as much as possible
> while True:
> arg = arg_list.get_next_string()
> if not arg.startswith('-'):
> # Glob this argument
> globarg = glob(arg)
> if len(globarg) > 0:
> except NoArgument:
> def __str__(self):
> from subprocess import Popen, PIPE
> process = Popen(['/bin/ls', '-C'] + self.args, stdout=PIPE,
> out, err = process.communicate('')
> return out + err
> [I have omitted the Action base class, which processes the user
> command-line arguments and passes it to the init() method in arg_list
> -- this listing was just to give you a basic idea of the complexity of
> getting a true-er 'ls' command].
> Your 'uname' command is likewise limited (and the printout looks strange:
> >>> print(platform.uname())
> ('Linux', 'Batman', '3.3.8-gentoo', '#1 SMP Fri Oct 5 14:14:57 EDT
> 2012', 'x86_64', 'AMD FX(tm)-6100 Six-Core Processor')
> [bash $] uname -a
> Linux Batman 3.3.8-gentoo #1 SMP Fri Oct 5 14:14:57 EDT 2012 x86_64
> AMD FX(tm)-6100 Six-Core Processor AuthenticAMD GNU/Linux
> You may want to change that to:
> def uname():
> print(' '.join(platform.uname()))
> Although again, oftentimes people want only something specific from
> uname (like -m or -n).
For now, I will decide if it would be worth my time to make such a
module seeing that many feel that it may not be useful. Thank you all
for your feedback.
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Python-list