_winapi.createprocess(executable, args subprocess 실행시

1 minute read

_winapi.CreateProcess(executable, args subprocess 실행시

_winapi.CreateProcess(executable, args

import subprocess

result = subprocess.run(['echo', 'echo test'],
                        capture_output=True,
                        encoding='utf8')

result.check_returncode()
print(result.stdout)

서브프로세스를 실행하는 코드를 수행하였는데.

Traceback (most recent call last):
  File "e:\workspace\cleanCoding\동시성과병렬성\useSubprocess.py", line 5, in <module>
    result = subprocess.run(['echo', '자식 프로세스가 보내니는 인사!'],
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\jaehyun\AppData\Local\Programs\Python\Python311\Lib\subprocess.py", line 548, in run
    with Popen(*popenargs, **kwargs) as process:
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\jaehyun\AppData\Local\Programs\Python\Python311\Lib\subprocess.py", line 1024, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "C:\Users\jaehyun\AppData\Local\Programs\Python\Python311\Lib\subprocess.py", line 1493, in _execute_child
    hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

와 같은 오류가 발생하였다.

해결 방법은 .

해당 방법은

_winapi.CreateProcess(executable, args, FileNotFoundError: [WinError 2]

을 참조했으며

System32에 환경변수가 설정이 되어있지 않아서 발생한 오류라고 한다.

%SystemRoot%\System32
%SystemRoot%\System32\Wbem
%SystemRoot%\System32\wbem

해결 방법이다.

근데 저자는 %SYSTEMROOT% 경로나, 환경변수 상에서 문제가 없는데도 불구하고 계속 에러가 나고있다.

야매 해결법

Python : FileNotFoundError [WinError 2] The system cannot find the file specified , subprocess.py:1582

에 글을 보면.

subprocess 생성자 부분의 shell 을 True로 변경하면 된다고 한다.

def __init__(self, args, bufsize=-1, executable=None,
                 stdin=None, stdout=None, stderr=None,
                 preexec_fn=None, close_fds=True,
                 shell=False, cwd=None, env=None, universal_newlines=None,
                 startupinfo=None, creationflags=0,
                 restore_signals=True, start_new_session=False,
                 pass_fds=(), *, user=None, group=None, extra_groups=None,
                 encoding=None, errors=None, text=None, umask=-1, pipesize=-1,
                 process_group=None):

실제로 테스트 해본 결과 True로 변경 시 정상적으로 작동하는 것 처럼 보이지만.

실제 command prompt에 buffer로 입력되는 값에서 에러가 발생한다.

또한 실제로 우리가 파이썬 커뮤니티에(내장 함수 일 경우) 검증을 받으면서 함수를 수정하는 것 이 아니기 때문에 이러한 방법은 더 큰 버그를 야기할 수 있다고 한다.

뭐 어쨌든간 win32API와 shell 상에서 문제가 발생하는 에러기에

subprocess.run(shell=False)

옵션을 추가하면 에러는 발생하지 않지만

사용할때마다. 너무 불편하다.. 음 ..

리눅스로 써버릴까..?

Updated: