2

Здравствуйте! Помогите. Нужна помощь: Цель программы - поиск mac адреса через cmd.exe при помощи команды arp -a, и последующим копированием результата (полностью) в файл. Я предполагаю что запуск cmd.exe и последующий ввод команды arp -a возможно реализовать через библиотеку os и аргумент (я предполагаю что arp -a это аргумент при запуске cmd.exe). Проблема в моем незнании того, как я могу запустить cmd с аргументом (arp -a), и получить вывод в файл.

jfs
  • 52,361

3 Answers3

2

Если команда не является внутренней (вроде ASSOC), то нет нужды как правило запускать cmd.exe, чтобы получить вывод внешней программы в Питоне.

Вместо этого напрямую запускайте программу. К примеру, чтобы перенаправить стандартный вывод arp -a команды в txt файл:

#!/usr/bin/env python3
import subprocess

with open('результат.txt', 'wb', 0) as file:
    subprocess.run('arp -a', stdout=file, check=True)

На Windows, команда и её аргументы передаются как строка (родной интерфейс). Переносимый код должен использовать список: каждый аргумент как отдельный элемент следовало бы передать: ['arp', '-a']. Если возникли проблемы с кодировкой, то см. Python Взаимодействие с cmd.exe.

Обратите внимание, что cmd.exe не используется для запуска arp.exe.

Если вы хотите запустить команду, которая требует cmd.exe, к примеру dir, то достаточно shell=True передать:

#!/usr/bin/env python3
import subprocess

subprocess.run('dir /A', check=True, shell=True)
jfs
  • 52,361
  • Необходима команда (аргумент ) arp -a (для просмотра MAC), но даже с assoc в txt файл выводится только стандартная информация из cmd: Microsoft Windows [Version 6.1.7601] (c) Љ®аЇ®а жЁп Њ ©Єа®б®дв (Microsoft Corp.), 2009. ‚ᥠЇа ў  § йЁйҐ­л.

    C:\Users\Documents>

    – Antony Voron Apr 09 '17 at 19:57
  • @AntonyVoron какой код запускали? Что ожидали получить? Что вместо этого происходит? Приведите код и вывод команды буквально (с форматированием). Опишите подробно чём он отличается от желаемого. Отредактируйте ваш вопрос и добавьте в него эту информацию (или новый создайте, если это новая проблема). – jfs Apr 09 '17 at 20:23
  • Обновил вопрос. Стало ли понятнее, и что мне еще добавить? – Antony Voron Apr 09 '17 at 20:34
  • Спасибо за участие, финальный код добавлю в шапку. – Antony Voron Apr 09 '17 at 21:19
  • @AntonyVoron понятней не стало. Какую ошибку код вызывал? Я обновил ответ, чтобы явно показать как arp вызвать. Не помещайте решение (ответ) в ваш вопрос. Назначение вопросов на Stack Overflow, чтобы они могли и другим людям помочь с той же проблемой (поэтому вопрос должен содержать ясное описание проблемы, а ответы должны содержать решение (желательно) в виде, который может пригодится не только автору вопроса. Автор не объявляет вопросы закрытыми на Stack Overflow (вы можете отметить ответ, который вам лично помог решить задачу как принятый, но это не мешает добавлению новых ответов). – jfs Apr 10 '17 at 08:02
1

Вопрос закрыт, финальный код программы для поиска mac адресов и сохранения в bin файл:

import subprocess
with open('sh$18mc.bin', 'wb', 0) as file:
    subprocess.run(r'c:\windows\system32\cmd.exe /C arp -a', stdout=file, check=True)

Спасибо @KitScribe за код открытия команды в cmd.exe, и @jfs за код вывода в файл. Спасибо всем участникам вопроса.

  • Я считаю что на ваш вопрос ответили, и ваш ответ как минимум излишен. Вам стоит его удалить. – Александр Jul 25 '22 at 17:14
0

Попробуйте

import os
os.startfile(r'c:\Windows\system32\cmd.exe', 'any-arg') #Cmd.exe start-up

В любом случае всегда можно прибегнуть к subprocces и сделать это следующим образом:

import subprocess
subprocess.Popen([r'C:\Windows\system32\cmd.exe', '--some-arg'])

Ну и также есть вариант запустить файл с помощью библиотеки os, но не c помощью startfile:

os.system(r'C:\Windows\system32\cmd.exe -myarg')
  • Мне необходим аргумент arp -a. В 1 случае выдает ошибку: Traceback (most recent call last): File "C:\Users\Artel\Documents\mac_finder.py", line 23, in os.startfile(r'C:\Windows\System32\cmd.exe', 'arp -a') #Cmd.exe start-up OSError: [WinError 1155] Указанному файлу не сопоставлено ни одно приложение для выполнения данной операции: 'C:\Windows\System32\cmd.exe' – Antony Voron Apr 09 '17 at 20:16
  • Попробуйтеos.system(r'C:\Windows\system32\cmd.exe arp -a') –  Apr 09 '17 at 20:22
  • Не прокатывает... не понимаю почему, но запускается только cmd.exe. Мне нужно, чтобы cmd.exe запускалась с запросом команды arp -a, и я так понимаю что это аргумент? – Antony Voron Apr 09 '17 at 20:25
  • @AntonyVoron окей, а с аргументом dir он как работает? Выводит текущую директорию? –  Apr 09 '17 at 20:31
  • Если код запуска с dir выглядит так: os.system(r'C:\Windows\system32\cmd.exe dir'), то нет, запускается cmd.exe с пустым полем ввода. – Antony Voron Apr 09 '17 at 20:33
  • @AntonyVoron окей. А вариант с subprocess? subprocess.Popen([r'.=cmd.exe', 'dir']) –  Apr 09 '17 at 20:40
  • @AntonyVoron только не забывайте, что subprocess импортировать надо ещё –  Apr 09 '17 at 20:44
  • Нет. Не знаю почему, но subprocess тоже не работает. Правда я изменил .=cmd.exe на полный путь, как того требовал питон, но не думаю что это сильно сказалось на результате. Не могли бы Вы проверить данный код у вас на компьютере (если конечно у вас Windows), возможно, это проблема сугубо моего ПК. – Antony Voron Apr 09 '17 at 20:46
  • @AntonyVoron да, я имел ввиду .\cmd.exe. То, что я написал - это опечатка. У меня не Windows и я не думаю, что это проблема вашего ПК. Но я зайду из под компьютера на виндовс. Скоро буду и мы продолжим смотреть что не так –  Apr 09 '17 at 20:51
  • 1
    2all, чтобы запустить, допустим, dir через cmd, то командная строка должна выглядеть так: cmd /C dir. Ключик /C означает "выполнить команду и закрыться". Просто cmd dir или cmd arp не работают, только с ключом /C. – insolor Apr 09 '17 at 20:57
  • @insolor спасибо! –  Apr 09 '17 at 21:06
  • @AntonyVoron os.system(r'C:\Windows\system32\cmd.exe /C arp -a') –  Apr 09 '17 at 21:06
  • @AntonyVoron вопросы ещё? –  Apr 09 '17 at 21:14
  • @KitScribe Большое вам человеческое спасибо! Все заработало. Для вывода в txt попробую сам адаптировать. Если возникнут вопросы, продолжу тему. Спасибо всем причастным. – Antony Voron Apr 09 '17 at 21:17
  • @AntonyVoron пожалуйста. Если возникнут вопросы, лучше открывайте новый вопрос. А этот закройте. –  Apr 09 '17 at 21:25
  • Все, больше вопросв не будет. Финальный код в шапке. – Antony Voron Apr 09 '17 at 21:30
  • второй параметр у os.startfile() это операция (к примеру: 'open', а не аргумент командной строки для cmd.exe ('any-arg' это неправильная операция). Ни один из вариантов в ответе не сохраняет вывод команды в файл. – jfs Apr 11 '17 at 16:58