Patchwork [bitbake-devel,2/2] replace os.popen with subprocess.Popen

login
register
mail settings
Submitter Robert Yang
Date May 20, 2012, 12:36 p.m.
Message ID <401cf2b62edc824883b8c7084f4f742e0b2d098c.1337515887.git.liezhi.yang@windriver.com>
Download mbox | patch
Permalink /patch/27999/
State New
Headers show

Comments

Robert Yang - May 20, 2012, 12:36 p.m.
Replace os.popen with subprocess.Popen since the older function would
fail (more or less) silently if the executed program cannot be found

There is a bb.process.run() which will invoke the Popen to run command,
use it for simplify the code.

For the:
p4file = os.popen("%s%s files %s" % (p4cmd, p4opt, depot))
...
for file in p4file:
    list = file.split()

in bitbake/lib/bb/fetch2/perforce.py, it should be an error in the past,
since it didn't use readline() to read the pipe, but directly used the
split() for the pipe. Use the bb.process.run would fix the problem since
bb.process.run will return strings.

More info:
http://docs.python.org/library/subprocess.html#subprocess-replacements

[YOCTO #2075]

Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
---
 bitbake/lib/bb/fetch2/perforce.py            |   11 ++++++-----
 bitbake/lib/bb/fetch2/svk.py                 |    4 ++--
 bitbake/lib/bb/ui/crumbs/builddetailspage.py |    5 +++--
 bitbake/lib/bb/ui/crumbs/hig.py              |    7 ++++---
 4 files changed, 15 insertions(+), 12 deletions(-)
Shane Wang - May 29, 2012, 2:58 p.m.
Robert, be careful. Your patch 094742bed2fc01d55f572da946fcfa7a48521401 has broke Hob.

I am going to assign the bug https://bugzilla.yoctoproject.org/show_bug.cgi?id=2511 to you and Kai.

The error is:
Traceback (most recent call last):
  File "/home/yocto-build5/poky-contrib/bitbake/lib/bb/ui/crumbs/builder.py", line 821, in handler_build_started_cb
    self.build_details_page.show_configurations(self.configuration, self.parameters)
  File "/home/yocto-build5/poky-contrib/bitbake/lib/bb/ui/crumbs/builddetailspage.py", line 336, in show_configurations
    self.config_tv.show(configurations, params)
  File "/home/yocto-build5/poky-contrib/bitbake/lib/bb/ui/crumbs/builddetailspage.py", line 105, in show
    f.close()
AttributeError: 'str' object has no attribute 'close'

--
Shane

Robert Yang wrote on 2012-05-20:

> Replace os.popen with subprocess.Popen since the older function would
> fail (more or less) silently if the executed program cannot be found
> 
> There is a bb.process.run() which will invoke the Popen to run command,
> use it for simplify the code.
> 
> For the:
> p4file = os.popen("%s%s files %s" % (p4cmd, p4opt, depot))
> ...
> for file in p4file:
>     list = file.split()
> in bitbake/lib/bb/fetch2/perforce.py, it should be an error in the past,
> since it didn't use readline() to read the pipe, but directly used the
> split() for the pipe. Use the bb.process.run would fix the problem since
> bb.process.run will return strings.
> 
> More info:
> http://docs.python.org/library/subprocess.html#subprocess-replacements
> 
> [YOCTO #2075]
> 
> Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
> ---
>  bitbake/lib/bb/fetch2/perforce.py            |   11 ++++++-----
>  bitbake/lib/bb/fetch2/svk.py                 |    4 ++--
>  bitbake/lib/bb/ui/crumbs/builddetailspage.py |    5 +++--
>  bitbake/lib/bb/ui/crumbs/hig.py              |    7 ++++---
>  4 files changed, 15 insertions(+), 12 deletions(-)
> diff --git a/bitbake/lib/bb/fetch2/perforce.py
> b/bitbake/lib/bb/fetch2/perforce.py index 6abf15d..df3a3a3 100644 ---
> a/bitbake/lib/bb/fetch2/perforce.py +++
> b/bitbake/lib/bb/fetch2/perforce.py @@ -91,8 +91,8 @@ class
> Perforce(FetchMethod):
> 
>          p4cmd = data.getVar('FETCHCOMMAND_p4', d, True)
>          logger.debug(1, "Running %s%s changes -m 1 %s", p4cmd, p4opt,
> depot) -        p4file = os.popen("%s%s changes -m 1 %s" % (p4cmd,
> p4opt, depot)) -        cset = p4file.readline().strip() +       
> p4file, errors = bb.process.run("%s%s changes -m 1 %s" % (p4cmd, p4opt,
> depot)) +        cset = p4file.strip()
>          logger.debug(1, "READ %s", cset)
>          if not cset:
>              return -1
> @@ -155,8 +155,8 @@ class Perforce(FetchMethod):
>          logger.debug(2, "Fetch: creating temporary directory")
>          bb.utils.mkdirhier(data.expand('${WORKDIR}', localdata))
>          data.setVar('TMPBASE', data.expand('${WORKDIR}/oep4.XXXXXX',
> localdata), localdata)
> -        tmppipe = os.popen(data.getVar('MKTEMPDIRCMD', localdata,
> True) or "false")
> -        tmpfile = tmppipe.readline().strip()
> +        tmpfile, errors = bb.process.run(data.getVar('MKTEMPDIRCMD',
> localdata, True) or "false")
> +        tmpfile = tmpfile.strip()
>          if not tmpfile:
>              raise FetchError("Fetch: unable to create temporary
> directory.. make sure 'mktemp' is in the PATH.", loc)
> 
> @@ -169,7 +169,8 @@ class Perforce(FetchMethod):
>          os.chdir(tmpfile)
>          logger.info("Fetch " + loc)
>          logger.info("%s%s files %s", p4cmd, p4opt, depot)
> -        p4file = os.popen("%s%s files %s" % (p4cmd, p4opt, depot)) +   
>     p4file, errors = bb.process.run("%s%s files %s" % (p4cmd, p4opt,
> depot)) +        p4file = p4file.strip()
> 
>          if not p4file:
>              raise FetchError("Fetch: unable to get the P4 files from %s" %
> depot, loc)
> diff --git a/bitbake/lib/bb/fetch2/svk.py b/bitbake/lib/bb/fetch2/svk.py
> index 9d34abf..ee3823f 100644
> --- a/bitbake/lib/bb/fetch2/svk.py
> +++ b/bitbake/lib/bb/fetch2/svk.py
> @@ -77,8 +77,8 @@ class Svk(FetchMethod):
>          logger.debug(2, "Fetch: creating temporary directory")
>          bb.utils.mkdirhier(data.expand('${WORKDIR}', localdata))
>          data.setVar('TMPBASE', data.expand('${WORKDIR}/oesvk.XXXXXX',
> localdata), localdata)
> -        tmppipe = os.popen(data.getVar('MKTEMPDIRCMD', localdata,
> True) or "false")
> -        tmpfile = tmppipe.readline().strip()
> +        tmpfile, errors = bb.process.run(data.getVar('MKTEMPDIRCMD',
> localdata, True) or "false")
> +        tmpfile = tmpfile.strip()
>          if not tmpfile:
>              logger.error()
>              raise FetchError("Fetch: unable to create temporary
> directory.. make sure 'mktemp' is in the PATH.", loc) diff --git
> a/bitbake/lib/bb/ui/crumbs/builddetailspage.py
> b/bitbake/lib/bb/ui/crumbs/builddetailspage.py index c2d5abc..3ec15d4
> 100755 --- a/bitbake/lib/bb/ui/crumbs/builddetailspage.py +++
> b/bitbake/lib/bb/ui/crumbs/builddetailspage.py @@ -23,6 +23,7 @@
>  import gtk import pango import gobject +import bb.process from
>  bb.ui.crumbs.progressbar import HobProgressBar from
>  bb.ui.crumbs.hobwidget import hic, HobNotebook, HobAltButton,
>  HobWarpCellRendererText from bb.ui.crumbs.runningbuild import
>  RunningBuildTreeView
> @@ -96,9 +97,9 @@ class BuildConfigurationTreeView(gtk.TreeView):
>          for path in src_config_info.layers:
>              import os, os.path
>              if os.path.exists(path):
> -                f = os.popen('cd %s; git branch 2>&1 | grep "^* " | tr -d
> "* "' % path)
> +                f, errors = bb.process.run('cd %s; git branch 2>&1 | grep
> "^* " | tr -d "* "' % path)
>                  if f:
> -                    branch = f.readline().lstrip('\n').rstrip('\n')
> +                    branch = f.strip('\n')
>                      vars.append(self.set_vars("Branch:", branch))
>                      f.close()
>                  break
> diff --git a/bitbake/lib/bb/ui/crumbs/hig.py b/bitbake/lib/bb/ui/crumbs/hig.py
> index 721d145..b3936f8 100644
> --- a/bitbake/lib/bb/ui/crumbs/hig.py
> +++ b/bitbake/lib/bb/ui/crumbs/hig.py
> @@ -25,12 +25,12 @@ import gobject
>  import hashlib import os import re -import subprocess import shlex from
>  bb.ui.crumbs.hobcolor import HobColors from bb.ui.crumbs.hobwidget
>  import hcc, hic, HobViewTable, HobInfoButton, HobButton, HobAltButton,
>  HobIconChecker from bb.ui.crumbs.progressbar import HobProgressBar
>  import bb.ui.crumbs.utils
> +import bb.process
> 
>  """
>  The following are convenience classes for implementing GNOME HIG
> compliant
> @@ -726,7 +726,8 @@ class DeployImageDialog (CrumbsDialog):
>          self.progress_bar.hide()
>      def popen_read(self, cmd):
> -        return os.popen("%s 2>/dev/null" % cmd).read().strip()
> +        tmpout, errors = bb.process.run("%s" % cmd)
> +        return tmpout.strip()
> 
>      def find_all_usb_devices(self):
>          usb_devs = [ os.readlink(u)
> @@ -755,7 +756,7 @@ class DeployImageDialog (CrumbsDialog):
>                  cmdline = bb.ui.crumbs.utils.which_terminal()
>                  if cmdline:
>                      cmdline += "\"sudo dd if=" + self.image_path + "
> of=" + combo_item + "\""
> -                    subprocess.Popen(args=shlex.split(cmdline))
> +                    bb.process.run(shlex.split(cmdline))
> 
>      def update_progress_bar(self, title, fraction, status=None):
>          self.progress_bar.update(fraction)
Shane Wang - May 29, 2012, 3:17 p.m.
Again, be careful to check whether "deploy image" and "run qemu" work.
Because previously I used "os.popen" and found the frontend process (i.e. the Hob) hangs when the backend process (i.e. the deployment process and the qemu process) is running.

So, I chose "subprocess.Popen", so please have a test with "deploy image" and "run qemu" after you replaced it.

--
Shane

Wang, Shane wrote on 2012-05-29:

> Robert, be careful. Your patch 094742bed2fc01d55f572da946fcfa7a48521401
> has broke Hob.
> 
> I am going to assign the bug
> https://bugzilla.yoctoproject.org/show_bug.cgi?id=2511 to you and Kai.
> 
> The error is:
> Traceback (most recent call last):
>   File
> "/home/yocto-build5/poky-contrib/bitbake/lib/bb/ui/crumbs/builder.py", line
> 821, in handler_build_started_cb
>     self.build_details_page.show_configurations(self.configuration,
> self.parameters)
>   File
> "/home/yocto-build5/poky-contrib/bitbake/lib/bb/ui/crumbs/builddetailspage
> .py", line 336, in show_configurations
>     self.config_tv.show(configurations, params)
>   File
> "/home/yocto-build5/poky-contrib/bitbake/lib/bb/ui/crumbs/builddetailspage
> .py", line 105, in show
>     f.close()
> AttributeError: 'str' object has no attribute 'close'
>
Robert Yang - May 30, 2012, 1:02 a.m.
On 05/29/2012 10:58 PM, Wang, Shane wrote:
> Robert, be careful. Your patch 094742bed2fc01d55f572da946fcfa7a48521401 has broke Hob.
>

Sorry, in bitbake/lib/bb/ui/crumbs/builddetailspage.py:

103                     branch = f.strip('\n')
104                     vars.append(self.set_vars("Branch:", branch))
105                     f.close()
106                 break

Remove the f.close should be OK, I will check the patch again to see whether
there is such an error in other corner, and then send a pull request today.

// Robert

> I am going to assign the bug https://bugzilla.yoctoproject.org/show_bug.cgi?id=2511 to you and Kai.
>
> The error is:
> Traceback (most recent call last):
>    File "/home/yocto-build5/poky-contrib/bitbake/lib/bb/ui/crumbs/builder.py", line 821, in handler_build_started_cb
>      self.build_details_page.show_configurations(self.configuration, self.parameters)
>    File "/home/yocto-build5/poky-contrib/bitbake/lib/bb/ui/crumbs/builddetailspage.py", line 336, in show_configurations
>      self.config_tv.show(configurations, params)
>    File "/home/yocto-build5/poky-contrib/bitbake/lib/bb/ui/crumbs/builddetailspage.py", line 105, in show
>      f.close()
> AttributeError: 'str' object has no attribute 'close'
>
> --
> Shane
>
> Robert Yang wrote on 2012-05-20:
>
>> Replace os.popen with subprocess.Popen since the older function would
>> fail (more or less) silently if the executed program cannot be found
>>
>> There is a bb.process.run() which will invoke the Popen to run command,
>> use it for simplify the code.
>>
>> For the:
>> p4file = os.popen("%s%s files %s" % (p4cmd, p4opt, depot))
>> ...
>> for file in p4file:
>>      list = file.split()
>> in bitbake/lib/bb/fetch2/perforce.py, it should be an error in the past,
>> since it didn't use readline() to read the pipe, but directly used the
>> split() for the pipe. Use the bb.process.run would fix the problem since
>> bb.process.run will return strings.
>>
>> More info:
>> http://docs.python.org/library/subprocess.html#subprocess-replacements
>>
>> [YOCTO #2075]
>>
>> Signed-off-by: Robert Yang<liezhi.yang@windriver.com>
>> ---
>>   bitbake/lib/bb/fetch2/perforce.py            |   11 ++++++-----
>>   bitbake/lib/bb/fetch2/svk.py                 |    4 ++--
>>   bitbake/lib/bb/ui/crumbs/builddetailspage.py |    5 +++--
>>   bitbake/lib/bb/ui/crumbs/hig.py              |    7 ++++---
>>   4 files changed, 15 insertions(+), 12 deletions(-)
>> diff --git a/bitbake/lib/bb/fetch2/perforce.py
>> b/bitbake/lib/bb/fetch2/perforce.py index 6abf15d..df3a3a3 100644 ---
>> a/bitbake/lib/bb/fetch2/perforce.py +++
>> b/bitbake/lib/bb/fetch2/perforce.py @@ -91,8 +91,8 @@ class
>> Perforce(FetchMethod):
>>
>>           p4cmd = data.getVar('FETCHCOMMAND_p4', d, True)
>>           logger.debug(1, "Running %s%s changes -m 1 %s", p4cmd, p4opt,
>> depot) -        p4file = os.popen("%s%s changes -m 1 %s" % (p4cmd,
>> p4opt, depot)) -        cset = p4file.readline().strip() +
>> p4file, errors = bb.process.run("%s%s changes -m 1 %s" % (p4cmd, p4opt,
>> depot)) +        cset = p4file.strip()
>>           logger.debug(1, "READ %s", cset)
>>           if not cset:
>>               return -1
>> @@ -155,8 +155,8 @@ class Perforce(FetchMethod):
>>           logger.debug(2, "Fetch: creating temporary directory")
>>           bb.utils.mkdirhier(data.expand('${WORKDIR}', localdata))
>>           data.setVar('TMPBASE', data.expand('${WORKDIR}/oep4.XXXXXX',
>> localdata), localdata)
>> -        tmppipe = os.popen(data.getVar('MKTEMPDIRCMD', localdata,
>> True) or "false")
>> -        tmpfile = tmppipe.readline().strip()
>> +        tmpfile, errors = bb.process.run(data.getVar('MKTEMPDIRCMD',
>> localdata, True) or "false")
>> +        tmpfile = tmpfile.strip()
>>           if not tmpfile:
>>               raise FetchError("Fetch: unable to create temporary
>> directory.. make sure 'mktemp' is in the PATH.", loc)
>>
>> @@ -169,7 +169,8 @@ class Perforce(FetchMethod):
>>           os.chdir(tmpfile)
>>           logger.info("Fetch " + loc)
>>           logger.info("%s%s files %s", p4cmd, p4opt, depot)
>> -        p4file = os.popen("%s%s files %s" % (p4cmd, p4opt, depot)) +
>>      p4file, errors = bb.process.run("%s%s files %s" % (p4cmd, p4opt,
>> depot)) +        p4file = p4file.strip()
>>
>>           if not p4file:
>>               raise FetchError("Fetch: unable to get the P4 files from %s" %
>> depot, loc)
>> diff --git a/bitbake/lib/bb/fetch2/svk.py b/bitbake/lib/bb/fetch2/svk.py
>> index 9d34abf..ee3823f 100644
>> --- a/bitbake/lib/bb/fetch2/svk.py
>> +++ b/bitbake/lib/bb/fetch2/svk.py
>> @@ -77,8 +77,8 @@ class Svk(FetchMethod):
>>           logger.debug(2, "Fetch: creating temporary directory")
>>           bb.utils.mkdirhier(data.expand('${WORKDIR}', localdata))
>>           data.setVar('TMPBASE', data.expand('${WORKDIR}/oesvk.XXXXXX',
>> localdata), localdata)
>> -        tmppipe = os.popen(data.getVar('MKTEMPDIRCMD', localdata,
>> True) or "false")
>> -        tmpfile = tmppipe.readline().strip()
>> +        tmpfile, errors = bb.process.run(data.getVar('MKTEMPDIRCMD',
>> localdata, True) or "false")
>> +        tmpfile = tmpfile.strip()
>>           if not tmpfile:
>>               logger.error()
>>               raise FetchError("Fetch: unable to create temporary
>> directory.. make sure 'mktemp' is in the PATH.", loc) diff --git
>> a/bitbake/lib/bb/ui/crumbs/builddetailspage.py
>> b/bitbake/lib/bb/ui/crumbs/builddetailspage.py index c2d5abc..3ec15d4
>> 100755 --- a/bitbake/lib/bb/ui/crumbs/builddetailspage.py +++
>> b/bitbake/lib/bb/ui/crumbs/builddetailspage.py @@ -23,6 +23,7 @@
>>   import gtk import pango import gobject +import bb.process from
>>   bb.ui.crumbs.progressbar import HobProgressBar from
>>   bb.ui.crumbs.hobwidget import hic, HobNotebook, HobAltButton,
>>   HobWarpCellRendererText from bb.ui.crumbs.runningbuild import
>>   RunningBuildTreeView
>> @@ -96,9 +97,9 @@ class BuildConfigurationTreeView(gtk.TreeView):
>>           for path in src_config_info.layers:
>>               import os, os.path
>>               if os.path.exists(path):
>> -                f = os.popen('cd %s; git branch 2>&1 | grep "^* " | tr -d
>> "* "' % path)
>> +                f, errors = bb.process.run('cd %s; git branch 2>&1 | grep
>> "^* " | tr -d "* "' % path)
>>                   if f:
>> -                    branch = f.readline().lstrip('\n').rstrip('\n')
>> +                    branch = f.strip('\n')
>>                       vars.append(self.set_vars("Branch:", branch))
>>                       f.close()
>>                   break
>> diff --git a/bitbake/lib/bb/ui/crumbs/hig.py b/bitbake/lib/bb/ui/crumbs/hig.py
>> index 721d145..b3936f8 100644
>> --- a/bitbake/lib/bb/ui/crumbs/hig.py
>> +++ b/bitbake/lib/bb/ui/crumbs/hig.py
>> @@ -25,12 +25,12 @@ import gobject
>>   import hashlib import os import re -import subprocess import shlex from
>>   bb.ui.crumbs.hobcolor import HobColors from bb.ui.crumbs.hobwidget
>>   import hcc, hic, HobViewTable, HobInfoButton, HobButton, HobAltButton,
>>   HobIconChecker from bb.ui.crumbs.progressbar import HobProgressBar
>>   import bb.ui.crumbs.utils
>> +import bb.process
>>
>>   """
>>   The following are convenience classes for implementing GNOME HIG
>> compliant
>> @@ -726,7 +726,8 @@ class DeployImageDialog (CrumbsDialog):
>>           self.progress_bar.hide()
>>       def popen_read(self, cmd):
>> -        return os.popen("%s 2>/dev/null" % cmd).read().strip()
>> +        tmpout, errors = bb.process.run("%s" % cmd)
>> +        return tmpout.strip()
>>
>>       def find_all_usb_devices(self):
>>           usb_devs = [ os.readlink(u)
>> @@ -755,7 +756,7 @@ class DeployImageDialog (CrumbsDialog):
>>                   cmdline = bb.ui.crumbs.utils.which_terminal()
>>                   if cmdline:
>>                       cmdline += "\"sudo dd if=" + self.image_path + "
>> of=" + combo_item + "\""
>> -                    subprocess.Popen(args=shlex.split(cmdline))
>> +                    bb.process.run(shlex.split(cmdline))
>>
>>       def update_progress_bar(self, title, fraction, status=None):
>>           self.progress_bar.update(fraction)
>
>
>
>
Shane Wang - May 30, 2012, 1:10 a.m.
Sounds good. Thanks.

--
Shane

Robert Yang wrote on 2012-05-30:

> 
> 
> On 05/29/2012 10:58 PM, Wang, Shane wrote:
>> Robert, be careful. Your patch 094742bed2fc01d55f572da946fcfa7a48521401
>> has broke Hob.
>> 
> 
> Sorry, in bitbake/lib/bb/ui/crumbs/builddetailspage.py:
> 
> 103                     branch = f.strip('\n')
> 104                     vars.append(self.set_vars("Branch:", branch))
> 105                     f.close()
> 106                 break
> 
> Remove the f.close should be OK, I will check the patch again to see whether
> there is such an error in other corner, and then send a pull request today.
> 
> // Robert
> 
>> I am going to assign the bug
>> https://bugzilla.yoctoproject.org/show_bug.cgi?id=2511 to you and Kai.
>> 
>> The error is:
>> Traceback (most recent call last):
>>    File
> "/home/yocto-build5/poky-contrib/bitbake/lib/bb/ui/crumbs/builder.py", line
> 821, in handler_build_started_cb
>>      self.build_details_page.show_configurations(self.configuration,
> self.parameters)
>>    File
> "/home/yocto-build5/poky-contrib/bitbake/lib/bb/ui/crumbs/builddetailspage
> .py", line 336, in show_configurations
>>      self.config_tv.show(configurations, params)
>>    File
> "/home/yocto-build5/poky-contrib/bitbake/lib/bb/ui/crumbs/builddetailspage
> .py", line 105, in show
>>      f.close()
>> AttributeError: 'str' object has no attribute 'close'
>> 
>> --
>> Shane
>> 
>> Robert Yang wrote on 2012-05-20:
>> 
>>> Replace os.popen with subprocess.Popen since the older function would
>>> fail (more or less) silently if the executed program cannot be found
>>> 
>>> There is a bb.process.run() which will invoke the Popen to run command,
>>> use it for simplify the code.
>>> 
>>> For the:
>>> p4file = os.popen("%s%s files %s" % (p4cmd, p4opt, depot))
>>> ...
>>> for file in p4file:
>>>      list = file.split()
>>> in bitbake/lib/bb/fetch2/perforce.py, it should be an error in the past,
>>> since it didn't use readline() to read the pipe, but directly used the
>>> split() for the pipe. Use the bb.process.run would fix the problem since
>>> bb.process.run will return strings.
>>> 
>>> More info:
>>> http://docs.python.org/library/subprocess.html#subprocess-replacements
>>> 
>>> [YOCTO #2075]
>>> 
>>> Signed-off-by: Robert Yang<liezhi.yang@windriver.com>
>>> ---
>>>   bitbake/lib/bb/fetch2/perforce.py            |   11 ++++++-----
>>>   bitbake/lib/bb/fetch2/svk.py                 |    4 ++--
>>>   bitbake/lib/bb/ui/crumbs/builddetailspage.py |    5 +++--
>>>   bitbake/lib/bb/ui/crumbs/hig.py              |    7 ++++---
>>>   4 files changed, 15 insertions(+), 12 deletions(-)
>>> diff --git a/bitbake/lib/bb/fetch2/perforce.py
>>> b/bitbake/lib/bb/fetch2/perforce.py index 6abf15d..df3a3a3 100644 ---
>>> a/bitbake/lib/bb/fetch2/perforce.py +++
>>> b/bitbake/lib/bb/fetch2/perforce.py @@ -91,8 +91,8 @@ class
>>> Perforce(FetchMethod):
>>> 
>>>           p4cmd = data.getVar('FETCHCOMMAND_p4', d, True)
>>>           logger.debug(1, "Running %s%s changes -m 1 %s", p4cmd,
> p4opt,
>>> depot) -        p4file = os.popen("%s%s changes -m 1 %s" % (p4cmd,
>>> p4opt, depot)) -        cset = p4file.readline().strip() +
>>> p4file, errors = bb.process.run("%s%s changes -m 1 %s" % (p4cmd, p4opt,
>>> depot)) +        cset = p4file.strip()
>>>           logger.debug(1, "READ %s", cset)
>>>           if not cset:
>>>               return -1
>>> @@ -155,8 +155,8 @@ class Perforce(FetchMethod):
>>>           logger.debug(2, "Fetch: creating temporary directory")
>>>           bb.utils.mkdirhier(data.expand('${WORKDIR}', localdata))
>>>           data.setVar('TMPBASE',
> data.expand('${WORKDIR}/oep4.XXXXXX',
>>> localdata), localdata) -        tmppipe =
>>> os.popen(data.getVar('MKTEMPDIRCMD', localdata, True) or "false") -   
>>>     tmpfile = tmppipe.readline().strip() +        tmpfile, errors =
>>> bb.process.run(data.getVar('MKTEMPDIRCMD', localdata, True) or
>>> "false") +        tmpfile = tmpfile.strip()
>>>           if not tmpfile:
>>>               raise FetchError("Fetch: unable to create temporary
>>> directory.. make sure 'mktemp' is in the PATH.", loc)
>>> 
>>> @@ -169,7 +169,8 @@ class Perforce(FetchMethod):
>>>           os.chdir(tmpfile)
>>>           logger.info("Fetch " + loc)
>>>           logger.info("%s%s files %s", p4cmd, p4opt, depot)
>>> -        p4file = os.popen("%s%s files %s" % (p4cmd, p4opt, depot)) +
>>>      p4file, errors = bb.process.run("%s%s files %s" % (p4cmd, p4opt,
>>> depot)) +        p4file = p4file.strip()
>>> 
>>>           if not p4file:
>>>               raise FetchError("Fetch: unable to get the P4 files
> from %s" %
>>> depot, loc)
>>> diff --git a/bitbake/lib/bb/fetch2/svk.py b/bitbake/lib/bb/fetch2/svk.py
>>> index 9d34abf..ee3823f 100644
>>> --- a/bitbake/lib/bb/fetch2/svk.py
>>> +++ b/bitbake/lib/bb/fetch2/svk.py
>>> @@ -77,8 +77,8 @@ class Svk(FetchMethod):
>>>           logger.debug(2, "Fetch: creating temporary directory")
>>>           bb.utils.mkdirhier(data.expand('${WORKDIR}', localdata))
>>>           data.setVar('TMPBASE',
> data.expand('${WORKDIR}/oesvk.XXXXXX',
>>> localdata), localdata) -        tmppipe =
>>> os.popen(data.getVar('MKTEMPDIRCMD', localdata, True) or "false") -   
>>>     tmpfile = tmppipe.readline().strip() +        tmpfile, errors =
>>> bb.process.run(data.getVar('MKTEMPDIRCMD', localdata, True) or
>>> "false") +        tmpfile = tmpfile.strip()
>>>           if not tmpfile:
>>>               logger.error()
>>>               raise FetchError("Fetch: unable to create temporary
>>> directory.. make sure 'mktemp' is in the PATH.", loc) diff --git
>>> a/bitbake/lib/bb/ui/crumbs/builddetailspage.py
>>> b/bitbake/lib/bb/ui/crumbs/builddetailspage.py index c2d5abc..3ec15d4
>>> 100755 --- a/bitbake/lib/bb/ui/crumbs/builddetailspage.py +++
>>> b/bitbake/lib/bb/ui/crumbs/builddetailspage.py @@ -23,6 +23,7 @@
>>>   import gtk import pango import gobject +import bb.process from
>>>   bb.ui.crumbs.progressbar import HobProgressBar from
>>>   bb.ui.crumbs.hobwidget import hic, HobNotebook, HobAltButton,
>>>   HobWarpCellRendererText from bb.ui.crumbs.runningbuild import
>>>   RunningBuildTreeView
>>> @@ -96,9 +97,9 @@ class BuildConfigurationTreeView(gtk.TreeView):
>>>           for path in src_config_info.layers:
>>>               import os, os.path
>>>               if os.path.exists(path):
>>> -                f = os.popen('cd %s; git branch 2>&1 | grep "^* " |
>>> tr -d "* "' % path) +                f, errors = bb.process.run('cd
>>> %s; git branch 2>&1 | grep "^* " | tr -d "* "' % path)
>>>                   if f:
>>> -                    branch = f.readline().lstrip('\n').rstrip('\n')
>>> +                    branch = f.strip('\n')
>>>                       vars.append(self.set_vars("Branch:", branch))
>>>                       f.close()
>>>                   break
>>> diff --git a/bitbake/lib/bb/ui/crumbs/hig.py
>>> b/bitbake/lib/bb/ui/crumbs/hig.py index 721d145..b3936f8 100644 ---
>>> a/bitbake/lib/bb/ui/crumbs/hig.py +++
>>> b/bitbake/lib/bb/ui/crumbs/hig.py @@ -25,12 +25,12 @@ import gobject
>>>   import hashlib import os import re -import subprocess import shlex
>>>   from bb.ui.crumbs.hobcolor import HobColors from
>>>   bb.ui.crumbs.hobwidget import hcc, hic, HobViewTable, HobInfoButton,
>>>   HobButton, HobAltButton, HobIconChecker from
>>>   bb.ui.crumbs.progressbar import HobProgressBar import
>>>   bb.ui.crumbs.utils
>>> +import bb.process
>>> 
>>>   """
>>>   The following are convenience classes for implementing GNOME HIG
>>> compliant
>>> @@ -726,7 +726,8 @@ class DeployImageDialog (CrumbsDialog):
>>>           self.progress_bar.hide()
>>>       def popen_read(self, cmd):
>>> -        return os.popen("%s 2>/dev/null" % cmd).read().strip()
>>> +        tmpout, errors = bb.process.run("%s" % cmd)
>>> +        return tmpout.strip()
>>> 
>>>       def find_all_usb_devices(self):
>>>           usb_devs = [ os.readlink(u)
>>> @@ -755,7 +756,7 @@ class DeployImageDialog (CrumbsDialog):
>>>                   cmdline = bb.ui.crumbs.utils.which_terminal()
>>>                   if cmdline:
>>>                       cmdline += "\"sudo dd if=" + self.image_path +
> "
>>> of=" + combo_item + "\""
>>> -                    subprocess.Popen(args=shlex.split(cmdline))
>>> +                    bb.process.run(shlex.split(cmdline))
>>> 
>>>       def update_progress_bar(self, title, fraction, status=None):
>>>           self.progress_bar.update(fraction)
>> 
>> 
>> 
>>

Patch

diff --git a/bitbake/lib/bb/fetch2/perforce.py b/bitbake/lib/bb/fetch2/perforce.py
index 6abf15d..df3a3a3 100644
--- a/bitbake/lib/bb/fetch2/perforce.py
+++ b/bitbake/lib/bb/fetch2/perforce.py
@@ -91,8 +91,8 @@  class Perforce(FetchMethod):
 
         p4cmd = data.getVar('FETCHCOMMAND_p4', d, True)
         logger.debug(1, "Running %s%s changes -m 1 %s", p4cmd, p4opt, depot)
-        p4file = os.popen("%s%s changes -m 1 %s" % (p4cmd, p4opt, depot))
-        cset = p4file.readline().strip()
+        p4file, errors = bb.process.run("%s%s changes -m 1 %s" % (p4cmd, p4opt, depot))
+        cset = p4file.strip()
         logger.debug(1, "READ %s", cset)
         if not cset:
             return -1
@@ -155,8 +155,8 @@  class Perforce(FetchMethod):
         logger.debug(2, "Fetch: creating temporary directory")
         bb.utils.mkdirhier(data.expand('${WORKDIR}', localdata))
         data.setVar('TMPBASE', data.expand('${WORKDIR}/oep4.XXXXXX', localdata), localdata)
-        tmppipe = os.popen(data.getVar('MKTEMPDIRCMD', localdata, True) or "false")
-        tmpfile = tmppipe.readline().strip()
+        tmpfile, errors = bb.process.run(data.getVar('MKTEMPDIRCMD', localdata, True) or "false")
+        tmpfile = tmpfile.strip()
         if not tmpfile:
             raise FetchError("Fetch: unable to create temporary directory.. make sure 'mktemp' is in the PATH.", loc)
 
@@ -169,7 +169,8 @@  class Perforce(FetchMethod):
         os.chdir(tmpfile)
         logger.info("Fetch " + loc)
         logger.info("%s%s files %s", p4cmd, p4opt, depot)
-        p4file = os.popen("%s%s files %s" % (p4cmd, p4opt, depot))
+        p4file, errors = bb.process.run("%s%s files %s" % (p4cmd, p4opt, depot))
+        p4file = p4file.strip()
 
         if not p4file:
             raise FetchError("Fetch: unable to get the P4 files from %s" % depot, loc)
diff --git a/bitbake/lib/bb/fetch2/svk.py b/bitbake/lib/bb/fetch2/svk.py
index 9d34abf..ee3823f 100644
--- a/bitbake/lib/bb/fetch2/svk.py
+++ b/bitbake/lib/bb/fetch2/svk.py
@@ -77,8 +77,8 @@  class Svk(FetchMethod):
         logger.debug(2, "Fetch: creating temporary directory")
         bb.utils.mkdirhier(data.expand('${WORKDIR}', localdata))
         data.setVar('TMPBASE', data.expand('${WORKDIR}/oesvk.XXXXXX', localdata), localdata)
-        tmppipe = os.popen(data.getVar('MKTEMPDIRCMD', localdata, True) or "false")
-        tmpfile = tmppipe.readline().strip()
+        tmpfile, errors = bb.process.run(data.getVar('MKTEMPDIRCMD', localdata, True) or "false")
+        tmpfile = tmpfile.strip()
         if not tmpfile:
             logger.error()
             raise FetchError("Fetch: unable to create temporary directory.. make sure 'mktemp' is in the PATH.", loc)
diff --git a/bitbake/lib/bb/ui/crumbs/builddetailspage.py b/bitbake/lib/bb/ui/crumbs/builddetailspage.py
index c2d5abc..3ec15d4 100755
--- a/bitbake/lib/bb/ui/crumbs/builddetailspage.py
+++ b/bitbake/lib/bb/ui/crumbs/builddetailspage.py
@@ -23,6 +23,7 @@ 
 import gtk
 import pango
 import gobject
+import bb.process
 from bb.ui.crumbs.progressbar import HobProgressBar
 from bb.ui.crumbs.hobwidget import hic, HobNotebook, HobAltButton, HobWarpCellRendererText
 from bb.ui.crumbs.runningbuild import RunningBuildTreeView
@@ -96,9 +97,9 @@  class BuildConfigurationTreeView(gtk.TreeView):
         for path in src_config_info.layers:
             import os, os.path
             if os.path.exists(path):
-                f = os.popen('cd %s; git branch 2>&1 | grep "^* " | tr -d "* "' % path)
+                f, errors = bb.process.run('cd %s; git branch 2>&1 | grep "^* " | tr -d "* "' % path)
                 if f:
-                    branch = f.readline().lstrip('\n').rstrip('\n')
+                    branch = f.strip('\n')
                     vars.append(self.set_vars("Branch:", branch))
                     f.close()
                 break
diff --git a/bitbake/lib/bb/ui/crumbs/hig.py b/bitbake/lib/bb/ui/crumbs/hig.py
index 721d145..b3936f8 100644
--- a/bitbake/lib/bb/ui/crumbs/hig.py
+++ b/bitbake/lib/bb/ui/crumbs/hig.py
@@ -25,12 +25,12 @@  import gobject
 import hashlib
 import os
 import re
-import subprocess
 import shlex
 from bb.ui.crumbs.hobcolor import HobColors
 from bb.ui.crumbs.hobwidget import hcc, hic, HobViewTable, HobInfoButton, HobButton, HobAltButton, HobIconChecker
 from bb.ui.crumbs.progressbar import HobProgressBar
 import bb.ui.crumbs.utils
+import bb.process
 
 """
 The following are convenience classes for implementing GNOME HIG compliant
@@ -726,7 +726,8 @@  class DeployImageDialog (CrumbsDialog):
         self.progress_bar.hide()
 
     def popen_read(self, cmd):
-        return os.popen("%s 2>/dev/null" % cmd).read().strip()
+        tmpout, errors = bb.process.run("%s" % cmd)
+        return tmpout.strip()
 
     def find_all_usb_devices(self):
         usb_devs = [ os.readlink(u)
@@ -755,7 +756,7 @@  class DeployImageDialog (CrumbsDialog):
                 cmdline = bb.ui.crumbs.utils.which_terminal()
                 if cmdline:
                     cmdline += "\"sudo dd if=" + self.image_path + " of=" + combo_item + "\""
-                    subprocess.Popen(args=shlex.split(cmdline))
+                    bb.process.run(shlex.split(cmdline))
 
     def update_progress_bar(self, title, fraction, status=None):
         self.progress_bar.update(fraction)