web-dev-qa-db-ja.com

サブプロセスpython filenotfounderror:[winerror 2]

私はJupyter Notebookを使用して kaggleからの主成分分析 )を学習してきましたが、このコードを実行すると

     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

パスは正しく、サブプロセスからのすべての呼び出しは同様に失敗するようです。

なぜこれが起こっているのか誰か誰か知っていますか?

11
learing

このコードは lsコマンド を実行します。これは すべてのPOSIX準拠システムで使用可能 です。

Microsoft Windowsを使用しています。 Microsoft Windowsは、デフォルトではPOSIXに準拠していません。たとえば、lsバイナリはありません。したがって、サブプロセスはファイルlsを見つけることができないため、FileNotFoundErrorを発行します。

MicrosoftのWindows上のBash をインストールすると、lsが得られます。

ただし、ディレクトリをリストするためのPython的で移植性の高い方法は、最初にサブプロセスを使用するのではなく、組み込みの os.listdir

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

cwd引数を追加して作業ディレクトリを指定してみてください。これは機能するはずです。

import os, subprocess
cwd = os.getcwd()
proc = subprocess.Popen(["ls" ,"../input"], cwd=cwd, stdout=subprocess.PIPE)
output = proc.stdout.read().decode("utf8")
0
evexoio

私はたまたま同じ質問をしました。 WindowsのJupiter Notebookでは、Phihagが提供する以下のコードを使用するとうまくいきます。ありがとうございました。

    import os
    print(os.listdir('../input'))
0
Emma Zhang