Lakshay Rohilla
Lakshay Rohilla

Reputation: 2728

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

Details error message:-

 FileNotFoundError

  [WinError 2] The system cannot find the file specified

  at ~\AppData\Local\Programs\Python\Python39\lib\subprocess.py:1582 in _execute_child
      1578│             sys.audit("subprocess.Popen", executable, args, cwd, env)
      1579│ 
      1580│             # Start the process
      1581│             try:
    → 1582│                 hp, ht, pid, tid = _winapi.CreateProcess(
      1583│                     executable,
      1584│                     args,
      1585│                     # no special security
      1586│                     None,
make: *** [makefile:14: format] Error 1

We have something similar issue listed here: https://bugs.python.org/issue17023

The file is there, the path is fine too. But why am I getting this error as the file is there at the specified location?

I`m getting this error while running formatter linters.

Upvotes: 17

Views: 95834

Answers (4)

JJJ Tech
JJJ Tech

Reputation: 11

Based on what had been discussed so far, one can simply add 'shell=True' to a subprocess.Popen() call. Below is an example. There is no need to manually modify the default 'shell' value in a package.

    process = subprocess.Popen(
        [topsort], #which topsort implementation we're using
        stdin=subprocess.PIPE, 
        stdout=subprocess.PIPE, 
        stderr=subprocess.PIPE,
        shell=True)

Upvotes: 1

Veysel Olgun
Veysel Olgun

Reputation: 598

I faced with this kind of error and I realize that if I change windows path to posix-style with pathlib.PureWindowsPath(<path>).as_posix(), it is working. Here what I do:

import subprocess as sp
import pathlib
import shlex

exe_path = r"C:\ffmpeg\bin\ffmpeg.exe"
print(f"exe path: {exe_path}")

try:
    cmd = f"{exe_path} -version"
    sp.Popen(shlex.split(cmd))
    sp.wait()
except FileNotFoundError as e:
    print(e)
    print("\n")

exe_path = pathlib.PureWindowsPath(exe_path).as_posix()
print(f"exe path: {exe_path}")

cmd = f"{exe_path} -version"
t=sp.Popen(shlex.split(cmd))
t.wait()

Out-->:

C:\Users\Veysel\Desktop>python file.py
exe path: C:\ffmpeg\bin\ffmpeg.exe
[WinError 2] The system cannot find the file specified

exe path: C:/ffmpeg/bin/ffmpeg.exe
ffmpeg version 2022-10-17-git-3bd0bf76fb-essentials_build-www.gyan.dev Copyright (c) 2000-2022 the FFmpeg developers

Upvotes: 0

Lakshay Rohilla
Lakshay Rohilla

Reputation: 2728

IMPORTANT NOTE:- In case of any modification made to the library file, it might cause compatibility issues later on with codes for other programmers. To get more information, about the necessity to set value for the shell, plz refer to the official docs, proper link is provide here.

As this error caused trouble in my work I did the following solution for now and everything is working fine for me.

To solve this error:- We have to modify the subprocess.py in your environment.

First of all, you have to locate this file and then edit it. In my PC it location is - C:\Users\User\AppData\Local\Programs\Python\Python39\Lib.

In this piece of code:-

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

You have to change the value of shell.
Change shell=False to shell = True.

This solution worked for me, I hope it`ll work for you too.

Thank you.

Upvotes: -3

Iman Dadras
Iman Dadras

Reputation: 341

You can just set shell = True and pass it to the subprocess class you are using. Modifying the library file will cause compatibility problems later on with codes from other programmers. To get some insight into why we need to set this variable, take a look at the documentation: "args is required for all calls and should be a string, or a sequence of program arguments. Providing a sequence of arguments is generally preferred, as it allows the module to take care of any required escaping and quoting of arguments (e.g. to permit spaces in file names). If passing a single string, either shell must be True (see below) or else the string must simply name the program to be executed without specifying any arguments."

Upvotes: 24

Related Questions