2017-11-16 6 views
0

안드로이드에서 systrace를 실행하려고하면 다음과 같은 오류가 발생합니다. "ValueError : stdin/stdout/stderr를 리디렉션하면 Windows 플랫폼에서 close_fds가 지원되지 않습니다."android systrace close_fds error

누구든지이 문제를 겪었습니까? 스택 추적

CRITICAL:root:(TimeoutThread-1-for-MainThread) Exception on _RunAdbCmd(<class 'devil.android.sdk.adb_wrapper.AdbWrapper'>, ['devices'], retries=2, timeout=30), attempt 1 of 3: ValueError('close_fds is not supported on Windows platforms if you redirect stdin/stdout/stderr',) 
CRITICAL:root:(TimeoutThread-2-for-MainThread) Exception on _RunAdbCmd(<class 'devil.android.sdk.adb_wrapper.AdbWrapper'>, ['devices'], retries=2, timeout=30), attempt 2 of 3: ValueError('close_fds is not supported on Windows platforms if you redirect stdin/stdout/stderr',) 
Traceback (most recent call last): 
    File "C:\Users\shaq\AppData\Local\Android\android-sdk\platform-tools\systrace\systrace.py", line 49, in <module> 
    sys.exit(run_systrace.main()) 
    File "C:\Users\shaq\AppData\Local\Android\android-sdk\platform-tools\systrace\catapult\systrace\systrace\run_systrace.py", line 194, in main 
    main_impl(sys.argv) 
    File "C:\Users\shaq\AppData\Local\Android\android-sdk\platform-tools\systrace\catapult\systrace\systrace\run_systrace.py", line 155, in main_impl 
    devices = [a.GetDeviceSerial() for a in adb_wrapper.AdbWrapper.Devices()] 
    File "C:\Users\shaq\AppData\Local\Android\android-sdk\platform-tools\systrace\catapult\systrace\systrace\..\..\devil\devil\android\sdk\adb_wrapper.py", line 363, in Devices 
    retries=retries) 
    File "C:\Users\shaq\AppData\Local\Android\android-sdk\platform-tools\systrace\catapult\systrace\systrace\..\..\devil\devil\android\sdk\adb_wrapper.py", line 383, in _RawDevices 
    output = cls._RunAdbCmd(cmd, timeout=timeout, retries=retries) 
    File "C:\Users\shaq\AppData\Local\Android\android-sdk\platform-tools\systrace\catapult\systrace\systrace\..\..\devil\devil\android\decorators.py", line 57, in timeout_retry_wrapper 
    retry_if_func=retry_if_func) 
    File "C:\Users\shaq\AppData\Local\Android\android-sdk\platform-tools\systrace\catapult\systrace\systrace\..\..\devil\devil\utils\timeout_retry.py", line 159, in Run 
    error_log_func=error_log_func) 
    File "C:\Users\shaq\AppData\Local\Android\android-sdk\platform-tools\systrace\catapult\systrace\systrace\..\..\devil\devil\utils\reraiser_thread.py", line 186, in JoinAll 
    self._JoinAll(watcher, timeout) 
    File "C:\Users\shaq\AppData\Local\Android\android-sdk\platform-tools\systrace\catapult\systrace\systrace\..\..\devil\devil\utils\reraiser_thread.py", line 158, in _JoinAll 
    thread.ReraiseIfException() 
    File "C:\Users\shaq\AppData\Local\Android\android-sdk\platform-tools\systrace\catapult\systrace\systrace\..\..\devil\devil\utils\reraiser_thread.py", line 81, in run 
    self._ret = self._func(*self._args, **self._kwargs) 
    File "C:\Users\shaq\AppData\Local\Android\android-sdk\platform-tools\systrace\catapult\systrace\systrace\..\..\devil\devil\utils\timeout_retry.py", line 152, in <lambda> 
    child_thread = reraiser_thread.ReraiserThread(lambda: func(*args, **kwargs), 
    File "C:\Users\shaq\AppData\Local\Android\android-sdk\platform-tools\systrace\catapult\systrace\systrace\..\..\devil\devil\android\decorators.py", line 47, in impl 
    return f(*args, **kwargs) 
    File "C:\Users\shaq\AppData\Local\Android\android-sdk\platform-tools\systrace\catapult\systrace\systrace\..\..\devil\devil\android\sdk\adb_wrapper.py", line 249, in _RunAdbCmd 
    timeout_retry.CurrentTimeoutThreadGroup().GetRemainingTime()) 
    File "C:\Users\shaq\AppData\Local\Android\android-sdk\platform-tools\systrace\catapult\systrace\systrace\..\..\devil\devil\utils\cmd_helper.py", line 313, in GetCmdStatusAndOutputWithTimeout 
    stderr=subprocess.STDOUT) 
    File "C:\Users\shaq\AppData\Local\Android\android-sdk\platform-tools\systrace\catapult\systrace\systrace\..\..\devil\devil\utils\cmd_helper.py", line 105, in Popen 
    shell=shell, close_fds=True, env=env, preexec_fn=preexec_fn) 
    File "C:\Python27\lib\subprocess.py", line 347, in __init__ 
    raise ValueError("close_fds is not supported on Windows " 
ValueError: close_fds is not supported on Windows platforms if you redirect stdin/stdout/stderr 

답변

0

아주 늦게 대답.

stdin/stdout/stderr 중 하나를 리디렉션하는 경우 오류 로그에서 설명한 것처럼 Windows에서는 close_fds을 사용할 수 없습니다. 당신이 정말로 (서브 프로세스가 다른 파일 디스크립터를 상속하지 않도록 내 경우 예를 들어) close_fds를 사용해야 할 경우

그러나, 당신은 해킹 close_fds을 사용하고 마법을 사용할 수 없습니다와 같은

def _hack_windows_subprocess(): 
    """HACK: python 2.7 file descriptors. 
    This magic hack fixes https://bugs.python.org/issue19575 
    by adding HANDLE_FLAG_INHERIT to all already opened file descriptors. 
    """ 
    # See https://github.com/secdev/scapy/issues/1136 
    import ctypes, msvcrt, stat 
    HANDLE_FLAG_INHERIT = 0x00000001 
    for fd in range(100): 
     try: 
      s = os.fstat(fd) 
     except: 
      break 
     if stat.S_ISREG(s.st_mode): 
      ctypes.windll.kernel32.SetHandleInformation(
       msvcrt.get_osfhandle(fd), 
       HANDLE_FLAG_INHERIT, 
       0) 
하위 프로세스 호출 바로 전에

을 실행하고 _hack_windows_subprocess을 실행하십시오.