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.

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

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.

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)

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.

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()

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

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.