How To Fix Python Subprocess Run Error FileNotFoundError: [winerror 2] The System Cannot Find The File Specified

When I execute a system program using the python subprocess module’s run method in windows, I meet an error message like below.

1. The FileNotFoundError: [WinError 2] The System Cannot Find The File Specified.

  1. Below is the detailed error message and the steps to reproduce it.
    >>> import subprocess
    
    >>> subprocess.run(["dir", "/p"])
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\Users\zhaosong\anaconda3\envs\env_python_37\lib\subprocess.py", line 488, in run
        with Popen(*popenargs, **kwargs) as process:
      File "C:\Users\zhaosong\anaconda3\envs\env_python_37\lib\subprocess.py", line 800, in __init__
        restore_signals, start_new_session)
      File "C:\Users\zhaosong\anaconda3\envs\env_python_37\lib\subprocess.py", line 1207, in _execute_child
        startupinfo)
    FileNotFoundError: [WinError 2] The system cannot find the file specified
  2. This error is because I run the above command in a window shell, but do not specify the shell=True argument in the subprocess module’s run method.
  3. After I add the shell=True argument in the subprocess module’s run method, it runs successfully like below.
    >>> import subprocess
    >>> ret = subprocess.run(["dir", "/p"], shell=True)
     Volume in drive C has no label.
     Volume Serial Number is C01B-6F8A
    
     Directory of C:\Users\zhaosong
    
    07/07/2020  18:58    <DIR>          .
    07/07/2020  18:58    <DIR>          ..
    ......
    02/08/2020  19:13    <DIR>          Videos
                   2 File(s)             50 bytes
                  23 Dir(s)  173,195,341,824 bytes free
    >>> ret
    CompletedProcess(args=['dir', '/p'], returncode=0)
  4. The subprocess module’s run method returns an instance of the subprocess.CompletedProcess class, this object records the completed process status data (ie: executed command, return code, etc.)

2. Question & Answer.

2.1  The FileNotFoundError: [WinError 2] Occurred When Use Python Subprocess Module’s Popen() Method.

  1. I use the python subprocess module’s Popen function to execute a windows executable program like below, and it throws the FileNotFoundError: [WinError 2].
    import subprocess as sp
    
    import os
    
    # This function will call the python subprocess module's Popen method to invoke a system executable program.
    def subprocess_popen_exmple():
        
        # Create the windows executable file command line arguments array.
        cmd_param_arrray = []
        
        # Add the command line arguments 
        cmd_param_arrray.append('start ')
    
        cmd_param_arrray.append('/wait ')
        
        # Get the windows system directory
        win_dir_path = os.environ['WINDIR'] + "\\System32\\"
        
        # Get the windows executable file ( notepad.exe ) path.
        cmd_executeable_file_path = os.path.join(win_dir_path, 'notepad.exe')
    
        # Add the above windows  executable file path to the command line arguments list.
        cmd_param_arrray.append(cmd_executeable_file_path)
        
        # Print out the command line arguments list elements.
        print(cmd_param_arrray)
        
        # Invoke the windows program with the python subprocess module's Popen() method.
        child = sp.Popen(cmd_param_arrray)
    
    if __name__ == '__main__':
        
        subprocess_popen_exmple()
  2. Below is the detailed error message.
    ['start ', '/wait ', 'C:\\Windows\\System32\\notepad.exe']
    Traceback (most recent call last):
      File "D:\Work\dev2qa.com-example-code\PythonExampleProject\com\dev2qa\example\thread\SubProcessExample.py", line 38, in <module>
        subprocess_popen_exmple()
      File "D:\Work\dev2qa.com-example-code\PythonExampleProject\com\dev2qa\example\thread\SubProcessExample.py", line 34, in subprocess_popen_exmple
        child = sp.Popen(cmd_param_arrray)
      File "C:\Users\zhaosong\anaconda3\lib\subprocess.py", line 854, in __init__
        self._execute_child(args, executable, preexec_fn, close_fds,
      File "C:\Users\zhaosong\anaconda3\lib\subprocess.py", line 1307, in _execute_child
        hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
    FileNotFoundError: [WinError 2] \u7cfb\u7edf\u627e\u4e0d\u5230\u6307\u5b9a\u7684\u6587\u4ef6\u3002
  3. To fix this error is very easy, you just need to add the windows executable file path as the first argument in the command line arguments list, then you can run the executable file sucessfully.
    import subprocess as sp
    
    import os
    
    # This function will call the python subprocess module's Popen method to invoke a system executable program.
    def subprocess_popen_exmple():
        
        # Create the windows executable file command line arguments array.
        cmd_param_arrray = []
        
        # Get the windows system directory
        win_dir_path = os.environ['WINDIR'] + "\\System32\\"
        
        # Get the windows executable file ( notepad.exe ) path.
        cmd_executeable_file_path = os.path.join(win_dir_path, 'notepad.exe')
    
        # Add the above windows  executable file path to the command line arguments list.
        cmd_param_arrray.append(cmd_executeable_file_path)
        
        # Add the command line arguments 
        cmd_param_arrray.append('start ')
    
        cmd_param_arrray.append('/wait ')
        
        # Print out the command line arguments list elements.
        print(cmd_param_arrray)
        
        # Invoke the windows program with the python subprocess module's Popen() method.
        child = sp.Popen(cmd_param_arrray)
    
    if __name__ == '__main__':
        
        subprocess_popen_exmple()

3 thoughts on “How To Fix Python Subprocess Run Error FileNotFoundError: [winerror 2] The System Cannot Find The File Specified”

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.