2017-11-28 19 views
8

からサブプロセスを呼び出すときに、私はのpython3にプロジェクトを移植していると私はWindows上で予期しないエラーに実行している無効です毎回プロセスがサブプロセスを使用して作成されて、私はこの例外を持っている:subprocess呼び出しから作成されている場所OSErrorのは:、基本的にはWindows上のPython 3.6に</p> <p>:[WinError 6]ハンドルは、Python 3.6

d:\temp\backpack\venv\myvenv_py3.6\lib\site-packages\git\cmd.py:1011: in _call_process 
    return self.execute(call, **exec_kwargs) 
d:\temp\backpack\venv\myvenv_py3.6\lib\site-packages\git\cmd.py:732: in execute 
    **subprocess_kwargs 
D:\temp\cpython-3.6.3\Lib\subprocess.py:611: in __init__ 
    _cleanup() 
D:\temp\cpython-3.6.3\Lib\subprocess.py:220: in _cleanup 
    res = inst._internal_poll(_deadstate=sys.maxsize) 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <subprocess.Popen object at 0x0000000004FD53C8> 
_deadstate = 9223372036854775807 
_WaitForSingleObject = <built-in function WaitForSingleObject> 
_WAIT_OBJECT_0 = 0, _GetExitCodeProcess = <built-in function GetExitCodeProcess> 

    def _internal_poll(self, _deadstate=None, 
      _WaitForSingleObject=_winapi.WaitForSingleObject, 
      _WAIT_OBJECT_0=_winapi.WAIT_OBJECT_0, 
      _GetExitCodeProcess=_winapi.GetExitCodeProcess): 
     """Check if child process has terminated. Returns returncode 
       attribute. 

       This method is called by __del__, so it can only refer to objects 
       in its local scope. 

       """ 
     _log.debug('proc._internal_poll self.pid=%s self._handle=%s self.returncode=%s self=%s', self.pid, self._handle, self.returncode, self) 
     if self.returncode is None: 
>   if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0: 
E   OSError: [WinError 6] The handle is invalid 

D:\temp\cpython-3.6.3\Lib\subprocess.py:1051: OSError 

は、それは問題ではありません(このプロジェクトでは、それはGitPythonパッケージからとplumbumから多くのです) 。

この実行はbuild scriptvenv/Scripts/coverage run -m pytest -v tests/を呼び出すこの傘の下で発生します。しかし、私はまた、生殖の面ではvenv/Scripts/pytest --cov=mypackage --cov-config .coveragerc - tests/pytest-covを試してみた:

  • を私の勝利7 PC上で常にパス :(
  • 勝利7仮想マシン上:
    • それは常には、それが常にを失敗したときに[<build script>venv/Scripts/coverage run -m pytestを起動する]
    • を失敗しましたときcoverage run -m pytest venv
    • から直接呼び出されたが、pytestはvirtualenvのそれは常に、どんなに<build script>がある場合に失敗します勝利10 PC上
  • から直接起動されたときには、常にを渡しています呼び出された、またはcoverage場合やpytestはvenvから直接呼び出され

私がこれまで持っている唯一の手掛かりは、このStackOverflowのスレッドからです:https://stackoverflow.com/a/43975118 より正確に言えば、モジュールの_cleanupメソッドに関連する有用なものを指す最初に受け入れられた回答からのコメントです。

+0

このスレッドの回答:https://stackoverflow.com/a/40108817/501074で問題を修正できませんでした。 –

+0

サブプロセスを使用しているコードは実際にどのように見えますか? –

答えて

1

一時停止の少し後、私はすぐにこれの背後にある理由を発見した。

を呼び出さなかったか、コンテキストマネージャーとしてgit.Repoを使用したプロジェクトで、GitPythonの使用が原因でした。 GitPythonのreadmeにwarning about thisがあります。

どのプロセス(args)が原因であるかを知るには、subprocess_internal_pollという方法でログを追加すると便利でした。 GitPythonについては、git cat-file ...