подпроцесса в 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:Anaconda3libsubprocess.py in check_output(timeout, *popenargs, **kwargs)
    624 
    625     return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
--> 626                **kwargs).stdout
    627 
    628 

D:Anaconda3libsubprocess.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:Anaconda3libsubprocess.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:Anaconda3libsubprocess.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

путь правильный,и кажется, что все вызовы из подпроцесса будут завершаться одинаково.

кто-нибудь знает, почему это происходит?

3 ответов


этот код работает ls команда, который доступно на всех POSIX-соответствуя системах.

вы используете Microsoft Windows. По умолчанию Microsoft Windows не соответствует POSIX. Например, нет ls бинарный. Поэтому подпроцесс не может найти файл ls, и, следовательно, излучает FileNotFoundError.

вы можете установить Microsoft баш на Windows, который даст вам ls.

, в pythonic и более портативный способ перечислить каталог не использовать подпроцесс в первую очередь, но встроенный os.listdir:
import os
print(os.listdir('../input'))

попробуйте указать рабочий каталог, добавив аргумент cwd, это должно работать

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

У меня был тот же вопрос. Использование приведенных ниже кодов, предоставленных Phihag, хорошо работает для меня на ноутбуке Jupiter в Windows. Спасибо.

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