subprocess python filenotfounderror: [winerror 2]
Asked Answered
Z

3

12

I've been using Jupyter Notebook to learn Principal Component Analysis from kaggle), but when I run this code

     from subprocess import check_output
     print(check_output(["ls", "../input"]).decode("utf8"))

I got an error below

FileNotFoundError Traceback (most recent call last)
<ipython-input-3-de0e39ca3ab8> in <module>()
      1 from subprocess import check_output
----> 2 print(check_output(["ls", "C:/Users/wanglei/Documents/input"]).decode("utf8"))

D:\Anaconda3\lib\subprocess.py in check_output(timeout, *popenargs, **kwargs)
    624 
    625     return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
--> 626                **kwargs).stdout
    627 
    628 

D:\Anaconda3\lib\subprocess.py in run(input, timeout, check, *popenargs, **kwargs)
    691         kwargs['stdin'] = PIPE
    692 
--> 693     with Popen(*popenargs, **kwargs) as process:
    694         try:
    695             stdout, stderr = process.communicate(input, timeout=timeout)

D:\Anaconda3\lib\subprocess.py in __init__(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags, restore_signals, start_new_session, pass_fds)
    945                                 c2pread, c2pwrite,
    946                                 errread, errwrite,
--> 947                                 restore_signals, start_new_session)
    948         except:
    949             # Cleanup if the child failed starting.

D:\Anaconda3\lib\subprocess.py in _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, unused_restore_signals, unused_start_new_session)
   1222                                          env,
   1223                                          cwd,
-> 1224                                          startupinfo)
   1225             finally:
   1226                 # Child is launched. Close the parent's copy of those pipe

The path is correct, and it seems that all the call from subprocess will fail similarly.

Does anyone have any idea why this is happening?

Zachar answered 29/3, 2017 at 8:35 Comment(0)
F
11

This code runs the ls command, which is available on all POSIX-conforming systems.

You are using Microsoft Windows. Microsoft Windows does not conform to POSIX by default. For instance, there is no ls binary. Therefore, subprocess cannot find the file ls, and thus emits a FileNotFoundError.

You can install Microsoft's Bash on Windows, which will give you ls.

However, the pythonic and more portable way to list a directory is not to use subprocess in the first place, but the built-in os.listdir:

import os
print(os.listdir('../input'))
Flunk answered 29/3, 2017 at 8:48 Comment(4)
Yes, you make a good point,and this works,but could you analyze why the subprocess module didn't work?ThxZachar
The subprocess module works fine. There is just no ls binary on your filesystem. Therefore, subprocess cannot find the ls file, and thus emits an FileNotFoundError.Flunk
Yes,I think you are right,all the example I run came from official website was baesd on POSIX,that's why the call all failed,bacause the Windows just do not follow the POSIX. LOLZachar
We can just use, print(os.listdir('input')) , if you are using os package.Sherrod
B
0

I happened to have the same question. Using the below codes provided by Phihag works good for me on Jupiter Notebook on Windows. Thank you.

    import os
    print(os.listdir('../input'))
Balalaika answered 1/8, 2018 at 18:59 Comment(0)
Y
-1

try specifying the working directory by adding a cwd arguement, this should work

import os, subprocess
cwd = os.getcwd()
proc = subprocess.Popen(["ls" ,"../input"], cwd=cwd, stdout=subprocess.PIPE)
output = proc.stdout.read().decode("utf8")
Ytterbia answered 29/3, 2017 at 8:48 Comment(2)
That is already the default for cwd. The problem here is also not related to the argument of ls (if it were, there would not be a FileNotFound error, but an error message from ls), but the binary itself.Flunk
unfortunately,it throws the same error.could this be the problem of subprocess module?Zachar

© 2022 - 2024 — McMap. All rights reserved.