подпроцесса в 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'))