2017-11-28 24 views
8

मैं python3 के लिए एक परियोजना पोर्टिंग कर रहा हूँ और मैं चल रहा हूँ से उपप्रक्रिया बुला अमान्य है: विंडोज परOSError: [WinError 6] संभाल जब विंडोज पर एक अनपेक्षित त्रुटि आ अजगर 3.6

अजगर 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 

यह कोई फर्क नहीं पड़ता, जहां subprocess कॉल से बनाया जा रहा है (इस परियोजना में यह GitPython पैकेज से और plumbum से बहुत कुछ है): हर बार एक प्रक्रिया उपप्रक्रिया साथ बनाया जा रहा है, मैं इस अपवाद है ।

यह निष्पादन इस छतरी के नीचे होता है: build script जो venv/Scripts/coverage run -m pytest -v tests/ को आमंत्रित करता है। मेरी जीत 7 पीसी पर

  • यह हमेशा :(
  • गुजरता एक 7 विन आभासी मशीन पर: लेकिन मैं यह भी venv/Scripts/pytest --cov=mypackage --cov-config .coveragerc - tests/ साथ pytest-cov की कोशिश की है प्रजनन के मामले में
      यह
    • हमेशा विफल रहता है जब [<build script> invokes venv/Scripts/coverage run -m pytest]
    • यह हमेशा विफल रहता है जब coverage run -m pytest सीधे venv
    • से शुरू हो जाती है लेकिन यह हमेशा गुजरता है जब pytest virtualenv
  • एक जीत 10 पीसी यह हमेशा विफल रहता होगा, कोई फर्क नहीं पड़ता अगर <build script> है पर
  • से सीधे शुरू हो जाती है लागू, या यदि coverage या pytest venv

केवल सुराग है कि मैं अब तक मिल गया है इस StackOverflow धागे से है से सीधे लागू कर रहे हैं: https://stackoverflow.com/a/43975118 और अधिक सटीक होने के लिए, यह पहले स्वीकार किए गए उत्तर से टिप्पणियां है जो मॉड्यूल से _cleanup विधि से संबंधित उपयोगी कुछ इंगित करती है।

+0

इस धागे से उत्तर https://stackoverflow.com/a/40108817/501074 इस समस्या को ठीक नहीं किया गया है। –

+0

सबप्रोसेस का उपयोग करने वाला आपका कोड वास्तव में कैसा दिखता है? –

उत्तर

1

थोड़ी देर के बाद, मुझे तुरंत इसके पीछे कारण मिला।

यह प्रोजेक्ट में GitPython उपयोग की वजह से git.Repo.close() पर कॉल नहीं किया गया था या संदर्भ प्रबंधक के रूप में git.Repo का उपयोग नहीं किया गया था। GitPython के रीडेमे पर warning about this है।

subprocess की _internal_poll विधि में लॉगिंग जोड़ने में मदद मिली यह जानने के लिए कि कौन सी प्रक्रिया (args) अपराधी है। GitPython के लिए यह git cat-file था ...

संबंधित मुद्दे