Python подпроцесс в Anaconda - любая команда завершается ошибкой с "filenotfound", если не запущена с shell = True - PullRequest
0 голосов
/ 17 июня 2020

Мой рабочий компьютер Windows 10, Python 3.7.3.

Сам файл Python, test.py, очень прост:

import subprocess
subprocess.call("echo foo")

Но он не запускается (Windows командная строка или встроенный терминал VS Code):

(chemistry) some/path> python test.py
Traceback (most recent call last):
  File "some/path/test.py", line 2, in <module>
    subprocess.call("echo foo")
  File "C:\Users\me\AppData\Local\Continuum\anaconda3\envs\chemistry\lib\subprocess.py", line 323, in call
    with Popen(*popenargs, **kwargs) as p:
  File "C:\Users\me\AppData\Local\Continuum\anaconda3\envs\chemistry\lib\subprocess.py", line 775, in __init__
    restore_signals, start_new_session)
  File "C:\Users\me\AppData\Local\Continuum\anaconda3\envs\chemistry\lib\subprocess.py", line 1178, in _execute_child
    startupinfo)
FileNotFoundError: [WinError 2] Le fichier spécifié est introuvable

(последняя строка - это французская версия FileNotFoundError: [WinError 2] The system cannot find the file specified.)

Я заменил команда echo foo на dir и exit 1 (все они выполняются, как ожидалось, в командной строке Windows), и ошибка каждый раз одинакова. Использование subprocess.call(["echo", "foo"]) делает то же самое.

Версия оболочки subprocess.call("echo foo", shell=True) работает так, как ожидалось, но, очевидно, это плохая практика с точки зрения безопасности; кроме того, я не понимаю, почему здесь может понадобиться аргумент оболочки, а ошибка отличается от ошибки, полученной, например, в Python Подпроцесс: команда не работает в Python, но работает в оболочке

Я пометил Anaconda, потому что не могу воспроизвести ошибку на моем персональном компьютере (Ubuntu 18, Python 3.8, без Anaconda), и это, кажется, самая отличительная особенность (если subprocess не работает на большом подмножестве Windows машины, которые были бы известны к настоящему времени), но, честно говоря, я понятия не имею, откуда взялась ошибка.

...