Critic my module

Devyn Collier Johnson devyncjohnson at gmail.com
Sat Jul 27 14:06:34 EDT 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 $?
> 1
>
> 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:
>          try:
>             arg = arg_list.get_next_string()
>             if not arg.startswith('-'):
>                # Glob this argument
>                globarg = glob(arg)
>                if len(globarg) > 0:
>                   self.args.extend(globarg)
>                else:
> self.args.append(arg)
>             else:
>  self.args.append(arg)
>          except NoArgument:
>             break
>
>    def __str__(self):
>       from subprocess import Popen, PIPE
>       process = Popen(['/bin/ls', '-C'] + self.args, stdout=PIPE, 
> stderr=PIPE)
>       out, err = process.communicate('')
>       process.wait()
>       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')
>
> Whereas:
>
> [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).
>
> HTH,
> Jason
>
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.

Mahalo,

DCJ
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20130727/07aaedb7/attachment.html>


More information about the Python-list mailing list