2016-07-25 4 views
0

Я столкнулся с некоторой загадкой при работе над проектом автоматизации.«Режим» не работает в подпроцессе python 3.5

Когда я пытаюсь запустить:

program = subprocess.run("mode") 

я получаю:

FileNotFoundError: [WinError 2] The system cannot find the file specified 

Однако, когда я режим заменить Ipconfig:

program = subprocess.run("ipconfig") 

он работает прекрасно.

У кого-нибудь есть объяснение? В настоящее время я использую командный файл для запуска команды mode, но я хотел бы изменить аргументы без редактирования командного файла.

Edit 1:

я просто попытался с помощью os.system:

os.system("mode") 

и работал.

Edit 2:

Сейчас я бы так же, как ответ на исходную задачу просто понять, что происходит.

+0

Возможно, вам понадобится 'shell = True'? –

+0

@Wayne Werner Итак, я попробовал его с Popen и установил оболочку в true, и он тоже работал. У вас есть какие-то подсказки, почему это так работает? Благодаря! – FlyingLightning

ответ

1

В Actual meaning of 'shell=True' in subprocess это в значительной степени говорит о том, что shell=True - это то, от чего вы должны уклоняться.

FileNotFoundError: [WinError 2] The system cannot find the file specified 

Это то, что прочит меня, что вы можете shell=True в вашем подпроцессе вызова. Если файл не найден, это означает одну из двух вещей:

  1. Это не на вашем пути.
  2. Это не фактически файл.

Например, в Linux:

$ which echo 
echo: shell built-in command 

Это делает это довольно очевидно, что является не echo файла. Это просто команда, встроенная в оболочку. Это может быть то же самое, когда дело доходит до mode на Windows. Хотя this site кажется, что это файл MODE.COM. Вы можете попробовать вызова что, как в

subprocess.run('MODE.COM') 

Это может работать - по крайней мере, по одному из the answers, что я связан с

, ссылающегося с помощью оболочки действительно позволяет вам переменные окружения и файл globs в соответствии с обычным механизмом оболочки. В системах POSIX оболочка расширяет файлы globs до списка файлов. В Windows файл glob (например, «. «) не расширяется за счет оболочки, так или иначе (но переменные окружения в командной строке расширены cmd.exe).

Так что в вашем случае, возможно mode не является файлом, но MODE.COMявляется, и поскольку Windows имеет пятнистые отношения с корпусом, кажется, что, пройдя shell=True, оболочка Windows с радостью принимает mode и преобразует ее в MODE.COM, но без нее она пытается выполнить файл с буквально именем mode, который не работает

Смежные вопросы