[PATCH rtems-tools] rtemstoolkit: Fix shlex.split to use posix mode and add unit test for pipe operation

Muhammad Sulthan Mazaya msulthanmazaya at gmail.com
Wed Jun 21 04:22:23 UTC 2023


> On 21/6/2023 11:55 am, Muhammad Sulthan Mazaya wrote:
> > Turns out subprocess.Popen operates on posix mode.
>
> Is this true for non-POSIX systems?
>
> Where is this documented?

It's not, turns out it is also dependent on the system too. It is
documented here
https://docs.python.org/3/library/subprocess.html#subprocess.Popen. Should
I add a check like this instead?

---
 rtemstoolkit/execute.py | 21 ++++++++++++++-------
 tester/rt/config.py     |  2 +-
 2 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/rtemstoolkit/execute.py b/rtemstoolkit/execute.py
index e47aa24..5f0d94b 100755
--- a/rtemstoolkit/execute.py
+++ b/rtemstoolkit/execute.py
@@ -392,7 +392,7 @@ class execute(object):
                         command[0] = command[0] + '.exe'
             # If a string split
             if isinstance(command, str):
-                command = shlex.split(command, posix=False)
+                command = shlex.split(command, posix=(os.name == 'posix'))
             # See if there is a pipe operator in the command. If present
             # split the commands by the pipe and run them with the pipe.
             # if no pipe it is the normal stdin and stdout
@@ -623,10 +623,11 @@ if __name__ == "__main__":
             proc.stdin.close()
             e.capture(proc)
             del proc
-        ec, proc = e.open(commands['open'])
-        if ec == 0:
-            e.capture(proc)
-            del proc
+        for c in commands['open']:
+            ec, proc = e.open(c)
+            if ec == 0:
+                e.capture(proc)
+                del proc

     def capture_output(text):
         print(text, end = '')
@@ -645,7 +646,10 @@ if __name__ == "__main__":
     commands['windows']['csubsts'] = [('netstat %0', ['-a']),
                                       ('netstat %0 %1', ['-a', '-n'])]
     commands['windows']['pipe'] = ('ftp', None, 'help\nquit')
-    commands['windows']['open'] = ["echo",  "hello rtems", "|", "findstr",
"rtems"]
+    commands['windows']['open'] = [
+            ["echo",  "hello rtems", "|", "findstr", "rtems"],
+            " ".join(["echo",  "hello rtems", "|", "findstr", "rtems"])
+            ]
     commands['unix']['shell'] = ['pwd', 'ls -las', './xyz', sh_shell_test]
     commands['unix']['spawn'] = ['ls', 'execute.pyc', ['ls', '-i']]
     commands['unix']['cmd'] = [('date'), ('date', '-R'), ('date', ['-u',
'+%d %D']),
@@ -653,7 +657,10 @@ if __name__ == "__main__":
     commands['unix']['csubsts'] = [('date %0 "+%d %D %S"', ['-u']),
                                    ('date %0 %1', ['-u', '+%d %D %S'])]
     commands['unix']['pipe'] = ('grep', 'hello', 'hello world')
-    commands['unix']['open'] = ["echo", "hello world", "|", "cut", "-d ",
"-f2"]
+    commands['unix']['open'] = [
+            ["echo", "hello world", "|", "cut", "-d ", "-f2"],
+            " ".join(["echo", "hello world", "|", "cut", "-d\" \"", "-f2"])
+            ]

     print(arg_list('cmd a1 a2 "a3 is a string" a4'))
     print(arg_list('cmd b1 b2 "b3 is a string a4'))
diff --git a/tester/rt/config.py b/tester/rt/config.py
index c0c31de..ceb044e 100644
--- a/tester/rt/config.py
+++ b/tester/rt/config.py
@@ -327,7 +327,7 @@ class file(config.file):
             if len(_data):
                 ds = [_data[0]]
                 if len(_data) > 1:
-                    ds += shlex.split(_data[1], posix=False)
+                    ds += shlex.split(_data[1], posix=(os.name == 'posix'))
             ds = self.expand(ds)

             if _directive == '%console':
-- 
2.34.1


On Wed, Jun 21, 2023 at 1:27 PM Chris Johns <chrisj at rtems.org> wrote:

> On 21/6/2023 11:55 am, Muhammad Sulthan Mazaya wrote:
> > Turns out subprocess.Popen operates on posix mode.
>
> Is this true for non-POSIX systems?
>
> Where is this documented?
>
> Chris
>
> Also, there is an
> > issue with previous implementation of pipe command that is fixed by
> > Chris. Now, it can also accepts command in form of a string. The unit
> > test for that is added via this patch.
> >
> > ---
> >  rtemstoolkit/execute.py | 21 ++++++++++++++-------
> >  tester/rt/config.py     |  2 +-
> >  2 files changed, 15 insertions(+), 8 deletions(-)
> >
> > diff --git a/rtemstoolkit/execute.py b/rtemstoolkit/execute.py
> > index e47aa24..3b7dcb0 100755
> > --- a/rtemstoolkit/execute.py
> > +++ b/rtemstoolkit/execute.py
> > @@ -392,7 +392,7 @@ class execute(object):
> >                          command[0] = command[0] + '.exe'
> >              # If a string split
> >              if isinstance(command, str):
> > -                command = shlex.split(command, posix=False)
> > +                command = shlex.split(command)
> >              # See if there is a pipe operator in the command. If present
> >              # split the commands by the pipe and run them with the pipe.
> >              # if no pipe it is the normal stdin and stdout
> > @@ -623,10 +623,11 @@ if __name__ == "__main__":
> >              proc.stdin.close()
> >              e.capture(proc)
> >              del proc
> > -        ec, proc = e.open(commands['open'])
> > -        if ec == 0:
> > -            e.capture(proc)
> > -            del proc
> > +        for c in commands['open']:
> > +            ec, proc = e.open(c)
> > +            if ec == 0:
> > +                e.capture(proc)
> > +                del proc
> >
> >      def capture_output(text):
> >          print(text, end = '')
> > @@ -645,7 +646,10 @@ if __name__ == "__main__":
> >      commands['windows']['csubsts'] = [('netstat %0', ['-a']),
> >                                        ('netstat %0 %1', ['-a', '-n'])]
> >      commands['windows']['pipe'] = ('ftp', None, 'help\nquit')
> > -    commands['windows']['open'] = ["echo",  "hello rtems", "|",
> "findstr", "rtems"]
> > +    commands['windows']['open'] = [
> > +            ["echo",  "hello rtems", "|", "findstr", "rtems"],
> > +            " ".join(["echo",  "hello rtems", "|", "findstr", "rtems"])
> > +            ]
> >      commands['unix']['shell'] = ['pwd', 'ls -las', './xyz',
> sh_shell_test]
> >      commands['unix']['spawn'] = ['ls', 'execute.pyc', ['ls', '-i']]
> >      commands['unix']['cmd'] = [('date'), ('date', '-R'), ('date',
> ['-u', '+%d %D']),
> > @@ -653,7 +657,10 @@ if __name__ == "__main__":
> >      commands['unix']['csubsts'] = [('date %0 "+%d %D %S"', ['-u']),
> >                                     ('date %0 %1', ['-u', '+%d %D %S'])]
> >      commands['unix']['pipe'] = ('grep', 'hello', 'hello world')
> > -    commands['unix']['open'] = ["echo", "hello world", "|", "cut", "-d
> ", "-f2"]
> > +    commands['unix']['open'] = [
> > +            ["echo", "hello world", "|", "cut", "-d ", "-f2"],
> > +            " ".join(["echo", "hello world", "|", "cut", "-d\" \"",
> "-f2"])
> > +            ]
> >
> >      print(arg_list('cmd a1 a2 "a3 is a string" a4'))
> >      print(arg_list('cmd b1 b2 "b3 is a string a4'))
> > diff --git a/tester/rt/config.py b/tester/rt/config.py
> > index c0c31de..3b12c6c 100644
> > --- a/tester/rt/config.py
> > +++ b/tester/rt/config.py
> > @@ -327,7 +327,7 @@ class file(config.file):
> >              if len(_data):
> >                  ds = [_data[0]]
> >                  if len(_data) > 1:
> > -                    ds += shlex.split(_data[1], posix=False)
> > +                    ds += shlex.split(_data[1])
> >              ds = self.expand(ds)
> >
> >              if _directive == '%console':
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20230621/ff2895d6/attachment-0001.htm>


More information about the devel mailing list