Как выполнить команду командной строки из Python - PullRequest
23 голосов
/ 30 марта 2011

Я пробовал что-то подобное, но без эффекта:

command = "cmd.exe"
proc = subprocess.Popen(command, stdin = subprocess.PIPE, stdout = subprocess.PIPE)
proc.stdin.write("dir c:\\")

Ответы [ 6 ]

41 голосов
/ 30 марта 2011

как насчет просто:

import os
os.system('dir c:\\')
17 голосов
/ 30 марта 2011

Вы, вероятно, хотите попробовать что-то вроде этого:

command = "cmd.exe /C dir C:\\"

Я не думаю, что вы можете подключиться к cmd.exe ... Если вы работаете с фоном UnixЧто ж, у cmd.exe есть какие-то уродливые бородавки!

РЕДАКТИРОВАТЬ: Согласно Свену Марнаху, вы можете дотянуть до cmd.exe.Я попытался выполнить следующие действия в оболочке Python:

>>> import subprocess
>>> proc = subprocess.Popen('cmd.exe', stdin = subprocess.PIPE, stdout = subprocess.PIPE)
>>> stdout, stderr = proc.communicate('dir c:\\')
>>> stdout
'Microsoft Windows [Version 6.1.7600]\r\nCopyright (c) 2009 Microsoft Corporatio
n.  All rights reserved.\r\n\r\nC:\\Python25>More? '

Как видите, у вас все еще есть немного работы (возвращается только первая строка), но вы могли бы заставить это работать...

10 голосов
/ 06 декабря 2014

Попробуйте:

import os

os.popen("Your command here")
6 голосов
/ 30 марта 2011

Попытайтесь добавить вызов к proc.stdin.flush() после записи в канал и посмотрите, не начинает ли ситуация вести себя лучше, чем вы ожидаете.Явная очистка канала означает, что вам не нужно беспокоиться о том, как именно установлена ​​буферизация.

Кроме того, не забудьте включить "\n" в конце вашей команды, иначе ваша дочерняя оболочка будетсидеть в приглашении, ожидая завершения ввода команды.

Я писал об использовании Popen для более подробной обработки экземпляра внешней оболочки по адресу: Выполнение трех команд в одном и том же процессе с Python

Как и в случае с этим вопросом, этот трюк может быть полезен, если вам необходимо поддерживать состояние оболочки при нескольких внешних вызовах на компьютере с Windows.

2 голосов
/ 30 марта 2011

Почему вы хотите позвонить cmd.exe?cmd.exe - командная строка (оболочка).Если вы хотите изменить каталог, используйте os.chdir("C:\\").Старайтесь не вызывать внешние команды, если Python может предоставить это.Фактически, большинство команд операционной системы предоставляются через модуль os (и sys).Я предлагаю вам взглянуть на документацию os модуля, чтобы увидеть различные доступные методы.

1 голос
/ 28 февраля 2019

Вдохновившись ответом (и редактированием) Дарена Томаса, попробуйте следующее:

proc = subprocess.Popen('dir C:\\', shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
out, err = proc.communicate()

out теперь будет содержать текстовый вывод. модуль подпроцесса уже обеспечивает интеграцию оболочки с shell=True, поэтому вам не нужно напрямую вызывать cmd.exe.

В качестве напоминания, если вы находитесь в Python 3, этобудет байтами, поэтому вы можете сделать out.decode() для преобразования в строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...