Hi Aiden,

If set kwargs["stdout"] = sys.stdout, then stdout and stderr messages from sub 
process will directly write to sys.stdout.
I think this patch works because sys.stdout.encoding is the correct encoding. 
So what do you think if we fix this Non-Ascii issue by
Changing the line of
message = stdout.decode(encoding='utf-8', errors='ignore') #for compatibility 
in python 2 and 3
to 
message = stdout.decode(encoding=sys.stdout.encoding , errors='ignore') #for 
compatibility in python 2 and 3

Otherwise, I think this patch may need to take care of the code after this line 
kwargs["stdout"] = sys.stdout, I mean
p.communicate() will return empty string after your change, and the following 
code would be useless. 

Thanks,
Bob

-----Original Message-----
From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of Park, 
Aiden
Sent: Thursday, December 12, 2019 6:43 AM
To: devel@edk2.groups.io
Subject: [edk2-devel] [PATCH] [edk2/BaseTools] edksetup.bat stuck on unicode 
locale Windows

This issue happens under two conditions.
  1. Unicode language environment in Windows
  2. Call 'edksetup.bat forcerebuild' with python subprocess.call()

Steps to reproduce
  C:\edk2>python
  Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:24:40)
  Type help, copyright, credits or license for more information.
  >>> import subprocess
  >>> subprocess.call(['edksetup.bat', 'forcerebuild'])

  The edksetup.bat stuck at 'nmake cleanall'.

One of multi-threads is on deadlock when python handles stdout and stderr in a 
subprocess pipe only if the outputs include unicode chars.
Only stderr will be handled in the pipe same as a single thread call.

Reported in Slim Bootloader.
  https://github.com/slimbootloader/slimbootloader/issues/478
Local fix has been made in Slim Bootloader.
  https://github.com/slimbootloader/slimbootloader/pull/490

Signed-off-by: Aiden Park <aiden.p...@intel.com>
---
 BaseTools/Source/C/Makefiles/NmakeSubdirs.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/BaseTools/Source/C/Makefiles/NmakeSubdirs.py 
b/BaseTools/Source/C/Makefiles/NmakeSubdirs.py
index 356f5ac..c77bfb0 100644
--- a/BaseTools/Source/C/Makefiles/NmakeSubdirs.py
+++ b/BaseTools/Source/C/Makefiles/NmakeSubdirs.py
@@ -33,7 +33,7 @@ def RunCommand(WorkDir=None, *Args, **kwargs):
     if "stderr" not in kwargs:
         kwargs["stderr"] = subprocess.STDOUT
     if "stdout" not in kwargs:
-        kwargs["stdout"] = subprocess.PIPE
+        kwargs["stdout"] = sys.stdout
     p = subprocess.Popen(Args, cwd=WorkDir, stderr=kwargs["stderr"], 
stdout=kwargs["stdout"])
     stdout, stderr = p.communicate()
     message = ""
--
2.10.2.windows.1




-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#52327): https://edk2.groups.io/g/devel/message/52327
Mute This Topic: https://groups.io/mt/68205236/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to