子进程python filenotfounderror:[winerror 2]

子进程python filenotfounderror:[winerror 2],python,python-3.x,subprocess,jupyter-notebook,kaggle,Python,Python 3.x,Subprocess,Jupyter Notebook,Kaggle,我一直在使用Jupyter笔记本学习),但当我运行此代码时 from subprocess import check_output print(check_output(["ls", "../input"]).decode("utf8")) 下面有个错误 FileNotFoundError Traceback (most recent call last) <ipython-input-3-de0e39ca3ab8> in <module>()

我一直在使用Jupyter笔记本学习),但当我运行此代码时

     from subprocess import check_output
     print(check_output(["ls", "../input"]).decode("utf8"))
下面有个错误

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
FileNotFoundError回溯(最近一次调用)
在()
1来自子流程导入检查\u输出
---->2打印(检查输出([“ls”,“C:/Users/wanglei/Documents/input”])。解码(“utf8”))
检查输出中的D:\Anaconda3\lib\subprocess.py(超时,*popenargs,**kwargs)
624
625返回运行(*popenargs,stdout=PIPE,timeout=timeout,check=True,
-->626**kwargs)标准件
627
628
D:\Anaconda3\lib\subprocess.py正在运行(输入、超时、检查、*popenargs、**kwargs)
691 kwargs['stdin']=管道
692
-->693采用Popen(*popenargs,**kwargs)作为流程:
694尝试:
695标准输出,标准输出=进程。通信(输入,超时=超时)
D:\Anaconda3\lib\subprocess.py在初始化中(self、args、bufsize、executable、stdin、stdout、stderr、preexec\fn、close\fds、shell、cwd、env、universal\u新行、startupinfo、creationflags、restore\u信号、start\u new\u session、pass\fds)
945 c2pread,c2pwrite,
946错误读取,错误写入,
-->947恢复信号,启动新会话)
948除了:
949#如果孩子启动失败,则进行清理。
D:\Anaconda3\lib\subprocess.py in_execute_child(self、args、execute、preexec_fn、close_fds、pass_fds、cwd、env、startupinfo、creationflags、shell、p2cread、p2cwrite、c2pread、c2pwrite、errread、errwrite、未使用的_还原_信号、未使用的_启动新_会话)
1222环境,
1223化学武器,
->1224(创业资讯)
1225最后:
1226#儿童发射。关闭这些管道的父级副本
路径是正确的,并且似乎来自子流程的所有调用都将以类似的方式失败


有人知道为什么会发生这种情况吗?

尝试通过添加cwd参数来指定工作目录,这样应该可以

import os, subprocess
cwd = os.getcwd()
proc = subprocess.Popen(["ls" ,"../input"], cwd=cwd, stdout=subprocess.PIPE)
output = proc.stdout.read().decode("utf8")
此代码运行

您正在使用Microsoft Windows。默认情况下,Microsoft Windows不符合POSIX。例如,没有
ls
binary。因此,子流程找不到文件
ls
,因此发出
FileNotFoundError

您可以安装,这将为您提供ls

但是,列出目录的pythonic和更可移植的方法不是首先使用subprocess,而是内置的:


我碰巧有同样的问题。在Windows上的Jupiter笔记本上,使用Phihag提供的以下代码对我很有用。多谢各位

    import os
    print(os.listdir('../input'))

这已经是
cwd
的默认值。这里的问题也与
ls
的参数无关(如果是,则不会出现
FileNotFound
错误,而是来自ls的错误消息),而是二进制文件本身。不幸的是,它抛出了相同的错误。这可能是子流程模块的问题吗?是的,您提出了一个很好的观点,这是有效的,但是你能分析一下为什么子流程模块不工作吗?子流程模块工作正常。文件系统上没有
ls
二进制文件。因此,子进程找不到
ls
文件,因此发出
FileNotFoundError
。是的,我想你是对的,我运行的所有示例都来自官方网站,都是POSIX上的baesd,这就是调用全部失败的原因,因为Windows没有遵循POSIX。如果您使用的是os软件包,我们可以直接使用、打印(os.listdir('input'))。
    import os
    print(os.listdir('../input'))