Subprocess python filenotfounderror: [winerror 2]

I use a Jupyter Notebook to find out Analysis of the main components 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 copy of those pipe 

The path is correct, and it seems that all calls from the subprocess will fail in the same way.

Does anyone know why this is happening?

+5
source share
2 answers

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

Used by Microsoft Windows. By default, Microsoft Windows is not POSIX compliant. For example, no ls binary code. Therefore, the subprocess cannot find the ls file and thus emits a FileNotFoundError .

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

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

 import os print(os.listdir('../input')) 
+4
source

try specifying the working directory by adding the cwd argument, 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") 
0
source

Source: https://habr.com/ru/post/1266064/


All Articles